모니터링/prometheus

[ prometheus ] blackbox exporter

김붕어87 2023. 9. 26. 10:41
반응형
개요
BlackBox exporter를 이용하여 외부에 있는 엔드포인트 서비스를 모니터링 할 수 있습니다.
HTTPS, HTTP, TCP, DNS, ICMP 등 외부 엔드포인트 probe(조사) 할 수 있습니다.

엔드포인트 모니터링은
HTTP 대기 시간
DNS 조회 대기 시간
SSL 인증서 만료 정보
TLS 버전
HTTP Version
접속 정보 (status 200, 4xx 등)

링크

 

1. whitebox와 blackbox 모니터링 차이점

  • whitebox 모니터링
    • 어플리케이션 로그, 시스템 내부 모니터링
    • CPU,MEM,DISK, POD, Instance 등 내부 정보 모니터링
  • blackbox 모니터링
    • 서버 다운, 페이지 작동 안함, 사이트 성능 저하 등 사용자에게 영향을 미치는 외부 동작을 모니터링

 

2. exporter 이란 ?

blackbox exporter은

HTTP,HTTP,TPC,DNS,ICMP 등 다양한 통계정보를 프로메테우스가 이해할 수 있는 정보로 변환하는 역할을 합니다.

 

 

3. blackbox exporter 설치

blackbox를 사용하려면 scraping하는 pod와 동일한 namespace에 배포해야합니다.

opentelemery 배포된 namespace : opentelemetry-operator-system

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus-blackbox-otel prometheus-community/prometheus-blackbox-exporter -n opentelemetry-operator-system

 

4. blackbox exporter 테스트

blackbox 테스트 용도 nginx pod 설치

vi nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

 

blackbox curl 테스트

www.google.com  probe 테스트

# nginx pod 접속
k exec pod/nginx-test-xxx -it /bin/bash -n 네임스페이스


# blackbox-exporter svc 정보 + URL 입력
curl "prometheus-blackbox-otel-prometheus-blackbox-exporter.opentelemetry-operator-system.svc.cluster.local:9115/probe?module=http_2xx&target=IP주소"

ex) 
curl "prometheus-blackbox-otel-prometheus-blackbox-exporter.opentelemetry-operator-system.svc.cluster.local:9115/probe?module=http_2xx&target=https://www.google.com"

 

 

5. Scrap 설정

OpenTelemery으로 blackbox exporter 메트릭정보를 scraping 합니다.

targets에 probe 테스트할 URL 입력

          ... 중간 생략 ...
          
          - job_name: blackbox-external-targets
            scrape_interval: 300s
            metrics_path: /probe
            params:
              module: [http_2xx]
            static_configs:
              - targets:
                - https://xxx.test.com
            relabel_configs:
              - source_labels: [__address__]
                target_label: __param_target
              - source_labels: [__param_target]
                target_label: instance
              - target_label: __address__
                replacement: prometheus-blackbox-otel-prometheus-blackbox-exporter:9115
                
... 중간 생략 ...

 

 

테스트 job 정보 

      - job_name: actuator-static
        scrape_interval: 15s
        metrics_path: /ddo/api/actuator/prometheus
        static_configs:
          - targets: ["x.x.x.x:8080"]
          
          
      - job_name: actuator-dns
        scrape_interval: 15s
        metrics_path: /ddo/api/actuator/prometheus
        dns_sd_configs:
        - names:
          - xxx-service.namespace.svc.cluster.local
          type: 'A'
          port: 8080
          
          
      - job_name: blackbox-kubernetes-services
        metrics_path: /probe
        params:
          module: [http_2xx]
        kubernetes_sd_configs:
        - role: service
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - target_label: __address__
            replacement:  prometheus-blackbox-prometheus-blackbox-exporter:9115
          - source_labels: [__param_target]
            target_label: instance
          - action: labelmap
            regex: __meta_kubernetes_service_label_(.+)
          - source_labels: [__meta_kubernetes_namespace]
            target_label: kubernetes_namespace
          - source_labels: [__meta_kubernetes_service_name]
            target_label: kubernetes_service_name


      - job_name: blackbox-kubernetes-pods
        metrics_path: /probe
        params:
          module: [http_2xx]
        kubernetes_sd_configs:
        - role: pod
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - target_label: __address__
            replacement:  prometheus-blackbox-prometheus-blackbox-exporter:9115
          - source_labels: [__param_target]
            replacement: ${1}/health
            target_label: instance
          - action: labelmap
            regex: __meta_kubernetes_pod_label_(.+)
          - source_labels: [__meta_kubernetes_namespace]
            target_label: kubernetes_namespace
          - source_labels: [__meta_kubernetes_pod_name]
            target_label: kubernetes_pod_name


      - job_name: blackbox-kubernetes-ingresses
        metrics_path: /probe
        params:
          module: [http_2xx]
        kubernetes_sd_configs:
        - role: ingress
        relabel_configs:
          - source_labels:
              [
                __meta_kubernetes_ingress_scheme,
                __address__,
                __meta_kubernetes_ingress_path,
              ]
            regex: (.+);(.+);(.+)
            replacement: ${1}://${2}${3}
            target_label: __param_target
          - target_label: __address__
            replacement: prometheus-blackbox-prometheus-blackbox-exporter:9115
          - source_labels: [__param_target]
            target_label: instance
          - action: labelmap
            regex: __meta_kubernetes_ingress_label_(.+)
          - source_labels: [__meta_kubernetes_namespace]
            target_label: kubernetes_namespace
          - source_labels: [__meta_kubernetes_ingress_name]
            target_label: ingress_name

 

6. prometheus Dashboard에서 메트릭 수집 확인

1. blackbox-exporter에서 수집되는 job 확인

 

2. metric 정보 확인 

prometheus dashboard -> Graph -> Open Metrics Explorer 클릭

메트릭 정보 확인 : probe_* 

 

3. 연결 정보 확인

probe_success{instance="https://xxx.test.com", job="blackbox-external-targets"}

ex) probe_success{instance="https://www.google.com", job="blackbox-external-targets"}

 

 

 

7.  Alert 설정 하기

... 중간 생략 ...
groups:
  - name: dev-portal_balckbox-rule # 그룹 이름
    rules:
    - alert: xxx-WebSite_NotFound
      expr: probe_success{job="blackbox-external-targets"} == 0
      for: 2m
      labels:
        severity: "critical"
      annotations:
        title: "WebSite {{`{{`}} $labels.instance {{`}}`}} Not Found(404)"
        description: "xxx Namespace pod (nginx 등)를 확인하세요."

... 중간 생략 ...

 

 

 

반응형