• VictoriaMetrics Stack 완전해부 - 4: VMAgent를 없애고 VMSingle 만 사용하기 실제 확인

    2026. 6. 9.

    by. Daramu

    이제 위 구성의 동작을 실제 화면으로 확인해 보겠다.

    현재 monitoring에 떠있는 pod는 다음과 같다.

    시각화의 grafana, 트레이스의 jeagerm, 전용 로그를 수집하는 otel-ds, 모든데이터를 중앙처리하는 otel-gw, 여러 정보에 라벨을 붙이는 vm-operator, 로그 백엔드의 vmlogs, 메트릭 백엔드의 vmsignle이다.

     

    그리고 여기서 앱의 트레이스와 로그를 push해줄 Open java agent를 주입해보겠다.

    방식은 이전 포스팅에서 이야기 했듯이, Instrumentation를 사용할 것이다.

     

    참고로 설치했다면 문제 없겠지만, otel crd가 없다면 설치가 필요하다.

    kubectl get crd | grep opentelemetry
    
    #없다면 설치
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.yaml
    
    helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts
    helm repo update
    
    helm install opentelemetry-operator open-telemetry/opentelemetry-operator \
      --namespace monitoring \
      --create-namespace
    apiVersion: opentelemetry.io/v1alpha1
    kind: Instrumentation
    metadata:
      name: otel-instrumentation
      namespace: default
    spec:
      exporter:
        endpoint: http://otel-gw-opentelemetry-collector.monitoring.svc.cluster.local:4317
      java:
        image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:latest
        env:
          - name: OTEL_EXPORTER_OTLP_PROTOCOL
            value: grpc
          - name: OTEL_METRICS_EXPORTER
            value: "otlp"
          - name: OTEL_LOGS_EXPORTER
            value: "otlp"
    kubectl apply -f instrumentation.yaml
    kubectl get instrumentation

     

    잘 나온다면 마지막으로 endpoint를 확인해준다.

    위의 get 명령어로 확인시 cli로 확인 가능하다.

    가장 마지막 Metrics_exporter를 추가함으로 otlp가 메트릭 수집까지 하는것을 허용했다.

    이제 이 파일이 메트릭과 트레이스, 두가지를 보낼 것이며, 보내기 위한 준비물은 어플리케이션 deployment.yaml 에 " instrumentation.opentelemetry.io/inject-java: "otel-instrumentation" 어노테이션을 추가하는 것이다.

     

    참고로 "Instrumentation" 는 수집할려면 서비스가 있는 ns에 맞춰야 한다.

    나는 모든 pod가 default에 떠 있어서 Instrumentation또한 default 네임스페이스에 올렸다.

    다른 곳이라면 Instrumentation의 namespace를 바꾸면 된다.

     

    모든 Spring boot 앱에 이렇게 추가해줬다.

    이름이 "otel-instrumentation" 인 이유는 위에서 만든 Instrumentation의 name이 name: otel-instrumentation 이기 때문이다.

     

    이제 CI/CD를 돌려 실제 서비스가 올라가도록 해보고, 모니터링에서 검사하겠다.

     

    웹 -> 사용자 정보 API 호출(/api/users/me) -> DB 호출 (Slect Query)-> 응답

    까지 정상적으로 트레이스 호출된 걸 확인할 수 있다.

     

    로그도 잘 찍힌다.

     

    Datasource에서 VictoriaLogs에 이런 설정을 하면 연결도 된다.

     

    helm yaml 방식이면 안될 수 있는데, 아래 처럼 추가

    #Jeager 의 정확한 name 확인 확인
    curl -u admin:<password> http://<grafana-url>/api/datasources
    
    datasources:
      datasources.yaml:
    ......
          # Logs - VictoriaLogs
          - name: VictoriaLogs
            type: victoriametrics-logs-datasource
            url: http://vmlogs-victoria-logs-single-server.monitoring.svc.cluster.local:9428
            access: proxy
            jsonData:
              derivedFields:
                - name: trace_id
                  matcherType: label
                  matcherQuery: trace_id
                  label: trace_id
                  url: "$${__value.raw}"
                  datasourceUid: Jaeger
    .....

    참고로 $$ 인 이유는 이스케이프 처리 때문이다. 그냥 $한개만 쓰면 안들어간다.

     

    위 설정을 하면 이런 링크가 생긴다.

     

    우측 트레이스 버튼을 누르면,

    해당 로그에 대한 트레이스도 볼 수 있다.

     

    댓글