Liberty 지표를 Prometheus/Grafana에서 확인

Liberty 메트릭을 Prometheus/Grafana에서 표시하는 방법을 확인합니다. 다음 기사에 적은 절차에서 Prometheus/Grafana가 배포된 Minikube 환경을 사용합니다.
  • Minikube에 Prometheus와 Grafana를 Helm 차트에 배포

  • 애플리케이션 준비



    샘플로서 여기 에 두고 있는 매우 간단한 Java 어플리케이션을 사용한다. Liberty 서버에서 mpMetrics-1.1 기능과 monitor-1.0를 활성화합니다.

    server.xml
    ...
      <featureManager>
    ...
        <feature>mpMetrics-1.1</feature>
        <feature>monitor-1.0</feature>
      </featureManager>
    ...
      <mpMetrics authentication="false" />
    ...
    
    mpMetrics-1.1 기능을 활성화하면 /metrics에서 메트릭 정보를 게시합니다. monitor-1.0를 활성화하면 base뿐만 아니라 vendor 범위 메트릭을 사용할 수 있습니다. 어떤 메트릭스를 취할 수 있는지 등은 다음 기사에도 쓰고 있으므로 그쪽을 참조.
  • Liberty의 성능 정보를 Python의 Sidecar로 얻기 (mpMetrics)

  • 이 어플리케이션을 가동시키는 Liberty 컨테이너 이미지를 sotoiwa540/sample:1.0 로서 DockerHub에 Push 해, 이하에서는 이 이미지를 사용한다.

    Dockerfile
    FROM websphere-liberty:18.0.0.4-webProfile8
    COPY --chown=1001:0 server.xml /config/
    RUN installUtility install --acceptLicense defaultServer
    COPY --chown=1001:0 mysql-connector-java-8.0.13.jar /config/resources/mysql/
    COPY --chown=1001:0 sample.war /config/apps/
    
    docker build -t sotoiwa540/sample:1.0 .
    docker push sotoiwa540/sample:1.0
    

    애플리케이션 배포



    배포할 Namespace를 만듭니다.
    kubectl create ns liberty
    

    매니페스트를 만들고 배포합니다.

    liberty-deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: liberty
    spec:
      selector:
        matchLabels:
          app: liberty
      replicas: 2
      template:
        metadata:
          labels:
            app: liberty
        spec:
          containers:
          - name: liberty
            image: sotoiwa540/sample:1.0
            imagePullPolicy: Always
            ports:
            - containerPort: 9080
    
    kubectl apply -f liberty-deployment.yaml -n liberty
    

    서비스 만들기



    Prometheus가 Liberty의 성능 정보를 얻도록 하려면 Service 정의에 주석을 추가합니다.

    liberty-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: liberty
      annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9080"
    spec:
      type: ClusterIP
      selector:
        app: liberty
      ports:
      - protocol: TCP
        port: 9080
    
    kubectl apply -f liberty-service.yaml -n liberty
    

    지표 확인



    Prometheus 메뉴에서 Status > Targets를 확인합니다.



    kubernertes-service-endpoints에 Liberty 엔드포인트가 추가되었는지 확인합니다.


    base: 또는 vendor:를 입력하여 mpMetrics 피처 메트릭을 얻을 수 있는지 확인합니다.





    시도에 base:memory_used_heap_bytes를 입력하고 Execute를 실행하여 값을 확인합니다. Liberty의 복제본 수가 2이므로 각각의 최근 데이터가 표시됩니다.



    Grafana에서의 표시



    패널을 추가하고 base:memory_used_heap_bytes (힙 사용량) 및 base:memory_committed_heap_bytes (힙 크기) 쿼리를 입력합니다. base:memory_max_heap_bytes (최대 힙 크기)도 표시해도 좋을지도 모른다. 범례는 instance의 라벨을 표시하고 있지만, 이것은 Service의 Endpoint이며, Pod명이 아닌 것이 조금 불편할지도 모른다.



    다음과 같은 대시보드를 볼 수 있었다.



    Pod 이름 표시



    Service의 Endpoint가 아닌 Pod명을 표시하려면, Prometheus의 scrape_configs를 커스터마이즈 해, Pod명의 라벨에 붙여 줄 필요가 있다. 현재 설정은 Status > Configuration에서 확인할 수 있다.



    설정은 prometheus-server라는 ConfigMap에 저장됩니다. 커스터마이즈는 Chart의 릴리스시에 지정할 수 있다. 이미 차트를 릴리스 완료한 경우는, 차트의 파라미터를 수정해 helm upgrade 로 적용할 수가 있어, ConfigMap 를 직접 수정해도 된다.

    차트의 파라미터를 수정하는 경우는 디폴트의 다른 것도 포함해 쓸 필요가 있을 것 같다. 이번에는 쉽게 ConfigMap을 수정합니다.
    kubectl edit cm prometheus-server -n monitoring
    

    다음을 추가.
    ...
        - job_name: kubernetes-service-endpoints
          kubernetes_sd_configs:
          - role: endpoints
          relabel_configs:
    ...
          - action: replace
            source_labels:
            - __meta_kubernetes_pod_name
            target_label: kubernetes_pod
    ...
    

    라벨이 추가되었는지 확인합니다.



    Grafana에서도 이 라벨을 범례로 지정한다.

    좋은 웹페이지 즐겨찾기