Konfigurace místních metrik a protokolů pro místní bránu služby Azure API Management

PLATÍ PRO: Vývojář | Prémie

Tento článek obsahuje podrobnosti o konfiguraci místních metrik a protokolů pro bránu v místním prostředí nasazenou v clusteru Kubernetes. Informace o konfiguraci cloudových metrik a protokolů najdete v tomto článku.

Metriky

Brána v místním prostředí podporuje statistiky, které se staly unifikačním protokolem pro shromažďování a agregaci metrik. Tato část vás provede postupem nasazení statistiky do Kubernetes, konfigurací brány pro generování metrik prostřednictvím statistiky a monitorováním metrik pomocí nástroje Prometheus .

Nasazení statistik a Prometheus do clusteru

Následující ukázková konfigurace YAML nasadí statistiky A Prometheus do clusteru Kubernetes, kde je nasazená brána v místním prostředí. Vytvoří také službu pro každou z nich. Brána v místním prostředí pak publikuje metriky do služby StatsD. K řídicímu panelu Prometheus se dostaneme prostřednictvím své služby.

Poznámka:

Následující příklad načítá image veřejného kontejneru z Docker Hubu. Doporučujeme nastavit tajný kód pro přijetí změn pro ověření pomocí účtu Docker Hubu místo vytvoření anonymní žádosti o přijetí změn. Pokud chcete zvýšit spolehlivost při práci s veřejným obsahem, importujte a spravujte image v privátním registru kontejnerů Azure. Přečtěte si další informace o práci s veřejnými imagemi.

apiVersion: v1
kind: ConfigMap
metadata:
  name: sputnik-metrics-config
data:
  statsd.yaml: ""
  prometheus.yaml: |
    global:
      scrape_interval:     3s
      evaluation_interval: 3s
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
      - job_name: 'test_metrics'
        static_configs:
          - targets: ['localhost:9102']
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sputnik-metrics
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sputnik-metrics
  template:
    metadata:
      labels:
        app: sputnik-metrics
    spec:
      containers:
      - name: sputnik-metrics-statsd
        image: prom/statsd-exporter
        ports:
        - name: tcp
          containerPort: 9102
        - name: udp
          containerPort: 8125
          protocol: UDP
        args:
          - --statsd.mapping-config=/tmp/statsd.yaml
          - --statsd.listen-udp=:8125
          - --web.listen-address=:9102
        volumeMounts:
          - mountPath: /tmp
            name: sputnik-metrics-config-files
      - name: sputnik-metrics-prometheus
        image: prom/prometheus
        ports:
        - name: tcp
          containerPort: 9090
        args:
          - --config.file=/tmp/prometheus.yaml
        volumeMounts:
          - mountPath: /tmp
            name: sputnik-metrics-config-files
      volumes:
        - name: sputnik-metrics-config-files
          configMap:
            name: sputnik-metrics-config
---
apiVersion: v1
kind: Service
metadata:
  name: sputnik-metrics-statsd
spec:
  type: NodePort
  ports:
  - name: udp
    port: 8125
    targetPort: 8125
    protocol: UDP
  selector:
    app: sputnik-metrics
---
apiVersion: v1
kind: Service
metadata:
  name: sputnik-metrics-prometheus
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 9090
    targetPort: 9090
  selector:
    app: sputnik-metrics

Uložte konfigurace do souboru s názvem metrics.yaml. Pomocí následujícího příkazu nasaďte vše do clusteru:

kubectl apply -f metrics.yaml

Po dokončení nasazení spusťte následující příkaz a zkontrolujte, jestli jsou pody spuštěné. Název vašeho podu se bude lišit.

kubectl get pods
NAME                                   READY   STATUS    RESTARTS   AGE
sputnik-metrics-f6d97548f-4xnb7        2/2     Running   0          1m

Spuštěním následujícího příkazu zkontrolujte, že jsou spuštěné services . Poznamenejte CLUSTER-IP si službu StatsD a PORT kterou použijeme později. Můžete navštívit řídicí panel Prometheus pomocí jeho EXTERNAL-IP a PORT.

kubectl get services
NAME                         TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE
sputnik-metrics-prometheus   LoadBalancer   10.0.252.72   13.89.141.90    9090:32663/TCP               18h
sputnik-metrics-statsd       NodePort       10.0.41.179   <none>          8125:32733/UDP               18h

Konfigurace brány v místním prostředí pro generování metrik

Teď, když jsou nasazené statistiky i Prometheus, můžeme aktualizovat konfigurace brány v místním prostředí a začít generovat metriky prostřednictvím statistiky. Tuto funkci je možné povolit nebo zakázat pomocí telemetry.metrics.local klíče v objektu ConfigMap nasazení brány v místním prostředí s dalšími možnostmi. K dispozici jsou následující možnosti:

Pole Výchozí Popis
telemetry.metrics.local none Povolí protokolování prostřednictvím statistiky. Hodnota může být none, statsd.
telemetry.metrics.local.statsd.endpoint Není k dispozici Určuje koncový bod statistiky.
telemetry.metrics.local.statsd.sampling Není k dispozici Určuje vzorkovací frekvenci metrik. Hodnota může být mezi 0 a 1. Příklad: 0.5
telemetry.metrics.local.statsd.tag-format Není k dispozici Formát označování exportéru StatsD. Hodnota může být none, , dogStatsDlibrato, influxDB.

Tady je ukázková konfigurace:

apiVersion: v1
kind: ConfigMap
metadata:
    name: contoso-gateway-environment
data:
    config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
    telemetry.metrics.local: "statsd"
    telemetry.metrics.local.statsd.endpoint: "10.0.41.179:8125"
    telemetry.metrics.local.statsd.sampling: "1"
    telemetry.metrics.local.statsd.tag-format: "dogStatsD"

Aktualizujte soubor YAML nasazení brány v místním prostředí s využitím výše uvedených konfigurací a použijte změny pomocí následujícího příkazu:

kubectl apply -f <file-name>.yaml

Pokud chcete získat nejnovější změny konfigurace, restartujte nasazení brány pomocí následujícího příkazu:

kubectl rollout restart deployment/<deployment-name>

Zobrazení metrik

Teď máme všechno nasazené a nakonfigurované, brána v místním prostředí by měla hlásit metriky prostřednictvím statistiky. Prometheus pak vybere metriky ze statistiky. Pomocí služby Prometheus přejděte PORT na řídicí panel EXTERNAL-IP Prometheus.

Proveďte některá volání rozhraní API přes bránu v místním prostředí, pokud je vše správně nakonfigurované, měli byste být schopni zobrazit následující metriky:

Metrický Popis
requests_total Počet požadavků rozhraní API v období
request_duration_seconds Počet milisekund od chvíle, kdy brána přijala požadavek, do chvíle odeslání úplné odpovědi.
request_backend_duration_seconds Počet milisekund strávených na celkových vstupně-výstupních operacích back-endu (připojování, odesílání a přijímání bajtů)
request_client_duration_seconds Počet milisekund strávených na celkových vstupně-výstupních operacích klienta (připojování, odesílání a přijímání bajtů)

Protokoly

Brána v místním prostředí ve výchozím nastavení odesílá protokoly do stdout a stderr ve výchozím nastavení. Protokoly můžete snadno zobrazit pomocí následujícího příkazu:

kubectl logs <pod-name>

Pokud je vaše brána v místním prostředí nasazená ve službě Azure Kubernetes Service, můžete službě Azure Monitor povolit, aby kontejnery shromažďovaly a stderr z vašich úloh a stdout zobrazovaly protokoly v Log Analytics.

Brána v místním prostředí také podporuje mnoho protokolů, mezi které patří localsyslog, rfc5424a journal. Následující tabulka shrnuje všechny podporované možnosti.

Pole Výchozí Popis
telemetry.logs.std text Umožňuje protokolování do standardních datových proudů. Hodnota může být none, , textjson
telemetry.logs.local auto Povolí místní protokolování. Hodnota může být none, , localsyslogauto, rfc5424, journaljson
telemetry.logs.local.localsyslog.endpoint Není k dispozici Určuje místní koncový bod syslogu. Podrobnosti najdete v místních protokolech syslogu.
telemetry.logs.local.localsyslog.facility Není k dispozici Určuje místní kód zařízení syslogu. Příklad: 7
telemetry.logs.local.rfc5424.endpoint Není k dispozici Určuje koncový bod rfc5424.
telemetry.logs.local.rfc5424.facility Není k dispozici Určuje kód zařízení na rfc5424. Příklad: 7
telemetry.logs.local.journal.endpoint Není k dispozici Určuje koncový bod deníku.
telemetry.logs.local.json.endpoint 127.0.0.1:8888 Určuje koncový bod UDP, který přijímá data JSON: cestu k souboru, IP:port nebo název hostitele:port.

Tady je ukázková konfigurace místního protokolování:

    apiVersion: v1
    kind: ConfigMap
    metadata:
        name: contoso-gateway-environment
    data:
        config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
        telemetry.logs.std: "text"
        telemetry.logs.local.localsyslog.endpoint: "/dev/log"
        telemetry.logs.local.localsyslog.facility: "7"

Použití místního koncového bodu JSON

Známá omezení

  • Pro místní diagnostiku podporujeme maximálně 3072 bajtů datové části požadavků a odpovědí. Formát JSON může přerušit cokoli výše kvůli blokům dat.

Použití místních protokolů syslogu

Konfigurace brány pro streamování protokolů

Při použití místního syslogu jako cíle pro protokoly musí modul runtime povolit streamování protokolů do cíle. V případě Kubernetes je potřeba připojit svazek, který odpovídá cíli.

Vzhledem k následující konfiguraci:

apiVersion: v1
kind: ConfigMap
metadata:
    name: contoso-gateway-environment
data:
    config.service.endpoint: "<self-hosted-gateway-management-endpoint>"
    telemetry.logs.local: localsyslog
    telemetry.logs.local.localsyslog.endpoint: /dev/log

Protokoly streamování můžete snadno spustit do místního koncového bodu syslogu:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: contoso-deployment
  labels:
    app: contoso
spec:
  replicas: 1
  selector:
    matchLabels:
      app: contoso
  template:
    metadata:
      labels:
        app: contoso
    spec:
      containers:
        name: azure-api-management-gateway
        image: mcr.microsoft.com/azure-api-management/gateway:2.5.0
        imagePullPolicy: IfNotPresent
        envFrom:
        - configMapRef:
            name: contoso-gateway-environment
        # ... redacted ...
+       volumeMounts:
+       - mountPath: /dev/log
+         name: logs
+     volumes:
+     - hostPath:
+         path: /dev/log
+         type: Socket
+       name: logs

Využívání místních protokolů syslogu ve službě Azure Kubernetes Service (AKS)

Při konfiguraci použití místního syslogu ve službě Azure Kubernetes Service můžete zvolit dva způsoby, jak prozkoumat protokoly:

Využívání protokolů z pracovních uzlů

Můžete je snadno využívat získáním přístupu k pracovním uzlům:

  1. Vytvoření připojení SSH k uzlu (dokumentace)
  2. Protokoly najdete v části host/var/log/syslog

Například všechny syslogy můžete filtrovat jenom na ty z brány v místním prostředí:

$ cat host/var/log/syslog | grep "apimuser"
May 15 05:54:20 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:20.0445178Z, isRequestSuccess=True, totalTime=290, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:20.0445178Z, region=Repro, correlationId=b28565ec-73e0-41e6-9312-efcdd6841846, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=287, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.cloudapp.net/api/resource?param1\=sample"
May 15 05:54:21 aks-agentpool-43853532-vmss000000 apimuser[8]: Timestamp=2023-05-15T05:54:21.1189171Z, isRequestSuccess=True, totalTime=150, category=GatewayLogs, callerIpAddress=141.134.132.243, timeGenerated=2023-05-15T05:54:21.1189171Z, region=Repro, correlationId=ab4d7464-acee-40ae-af95-a521cc57c759, method=GET, url="http://20.126.242.200/echo/resource?param1\=sample", backendResponseCode=200, responseCode=200, responseSize=628, cache=none, backendTime=148, apiId=echo-api, operationId=retrieve-resource, apimSubscriptionId=master, clientProtocol=HTTP/1.1, backendProtocol=HTTP/1.1, apiRevision=1, backendMethod=GET, backendUrl="http://echoapi.cloudapp.net/api/resource?param1\=sample"

Poznámka:

Pokud jste například změnili kořen pomocí chrootvýše chroot /hostuvedené cesty, musí tato změna odrážet.

Další kroky