# Java

본 문서는 2가지 설정에 대해 가이드 합니다.&#x20;

1. Log 설정 가이드
2. APM 설정 가이드

## (공통) Instrumentation CR 생성

***

`인프라 - 커스텀 리소스` 메뉴에서 작업할 클러스터를 선택하고 **instrumentations** CRD를 선택합니다. 생성 버튼을 이용하여 네임스페이스 별로 자동 계측할 내용을 등록 할 수 있습니다.&#x20;

<figure><img src="https://1668522666-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fvqp2nCQPDsjfLSru1kHs%2Fuploads%2FEkjVFB2xn34xNLhOVAYu%2Fimage.png?alt=media&#x26;token=e62255ba-015d-461b-a169-3cfdaab1392c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Instrumentation 커스텀 리소스는 네임스페이스 기준으로 적용되고, 다른 언어에 대해서도 선언 가능합니다. 본 가이드는 Java 에 대해 설명합니다.&#x20;
{% endhint %}

### Spec (생성 YAML)

```yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: {Instrumentation name}
spec:
  exporter:
    endpoint: http://cocktail-telemetry-collector.cocktail-addon:4318
  java:
    env:
      - name: OTEL_LOGS_EXPORTER
        value: otlp
      - name: OTEL_METRICS_EXPORTER
        value: otlp
      - name: OTEL_TRACES_EXPORTER
        value: otlp              
      - name: OTEL_EXPORTER_OTLP_PROTOCOL
        value: http/protobuf

        # 해당 네임스페이스의 anotation 값이 'true'인 모든 자바 어플리케이션을 수집하고싶을때 사용.
        # 아래 설정은 네임스페이스내 모든 Java 애플리케이션을 같은 이름으로 선언하는 경우 사용함.
        # 워크로드별 애플리케이션 이름을 다르게 사용하고자 하는 경우 각 애플리케이션 환경 변수에 설정.
      - name: OTEL_SERVICE_NAME
        value: {애플리케이션 이름}
      - name: OTEL_EXPORTER_OTLP_LOGS_HEADERS
        value: app_token={애플리케이션 토큰},app_name={애플리케이션 이름}
```

* spce.exporter.endpoint : Collector 접속 주소를 입력 합니다. 칵테일에서는 고정값입니다.&#x20;
* `OTEL_LOGS_EXPORTER` : 로그를 수집하는 collector에 전달하는 프로토콜을 정의합니다.&#x20;
  * otlp : OpenTelemetry Protocol을 사용하여 Collector에 정보를 전달합니다.&#x20;
  * none: 사용하지 않습니다.&#x20;
* `OTEL_METRICS_EXPORTER` : 메트릭을 수집하는 collector에 전달하는 프로토콜을 정의합니다.&#x20;
  * otlp : OpenTelemetry Protocol을 사용하여 Collector에 정보를 전달합니다.&#x20;
  * none: 사용하지 않습니다.&#x20;
* `OTEL_TRACES_EXPORTER` : 트레이스(추적)를 수집하는 collector에 전달하는 프로토콜을 정의합니다.&#x20;
  * otlp : OpenTelemetry Protocol을 사용하여 Collector에 정보를 전달합니다.&#x20;
  * none: 사용하지 않습니다.&#x20;
* `OTEL_EXPORTER_OTLP_PROTOCOL` : OpenTelemetry Collector에서 전달 받을 프토토콜 종류 선택
  * http/protobuf : 기본값으로 칵테일에서는 이 값을 사용합니다. &#x20;

{% hint style="info" %}
커스텀 리소스를 통한 설정은 해당 네임스페이스에 있는 모든 애플리케이션이 대상입니다. 개별 어플리케이션 마다 환경변수를 추가하면 각기 다른 애플리케이션의 메트릭을 수집합니다.
{% endhint %}

## 워크로드 수정

***

### Instrumentation 설정

에이전트를 주입 할 워크로드에 어노테이션을 추가합니다.

`애플리케이션 - 서비스맵 - 워크로드 - 애플리케이션 선택 - "설정"` 버튼을 클릭합니다.

<figure><img src="https://1668522666-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fvqp2nCQPDsjfLSru1kHs%2Fuploads%2FPiNnewTsKNZmfWW1PVo6%2Fimage.png?alt=media&#x26;token=9d19cf1e-cf48-4df8-aa5a-86e52a6b0686" alt=""><figcaption></figcaption></figure>

Yaml 보기를 변경하여 template - metadata - annotaions 부분에 다음과 같은 어노테이션을 추가합니다.

```yaml
instrumentation.opentelemetry.io/inject-java: 'true'
```

### Log 설정

#### 개별 환경 변수 설정

워크로드 별 애플리케이션 이름을 별도로 가져가는 경우에 사용합니다.&#x20;

<figure><img src="https://1668522666-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fvqp2nCQPDsjfLSru1kHs%2Fuploads%2FO24QKTbUbeDuAM5pgDot%2Fimage.png?alt=media&#x26;token=d98d31f5-a0a8-4f28-a2a4-d47dd1a9067b" alt=""><figcaption></figcaption></figure>

```yaml
  template:
    spec:
      containers:
      - env:
        # Application 이름
        - name: OTEL_SERVICE_NAME
          value: {애플리케이션 이름}
        # 인증을 위한 설정
        - name: OTEL_EXPORTER_OTLP_LOGS_HEADERS
          value: app_token={애플리케이션 토큰},app_name={애플리케이션 이름}        

```

### APM 설정 (Metrics, Traces)

#### 개별 환경 변수 설정

```yaml
  template:
    spec:
      containers:
      - env:
        # Application 이름
        - name: OTEL_SERVICE_NAME
          value: {애플리케이션 이름}
        # 추가 수집하는 Attribute 정보 (토큰값을 포함합니다.)
        - name: OTEL_RESOURCE_ATTRIBUTES
          value: token={애플리케이션 토큰}

```

####
