Configurar logs e métricas locais para gateway auto-hospedado de Gerenciamento de API do Azure

APLICA-SE A: Desenvolvedor | Premium

Este artigo fornece detalhes para configurar métricas e logs locais para o gateway auto-hospedado implantado em um cluster do Kubernetes. Para configurar as métricas e o logs na nuvem, consulte este artigo.

Métricas

O gateway auto-hospedado dá suporte ao StatsD, que se tornou um protocolo unificador para coleta e agregação de métricas. Esta seção percorre as etapas para implantar o StatsD no Kubernetes, configurar o gateway para emitir métricas por meio do StatsD e usar o Prometheus para monitorar as métricas.

Implantar StatsD e Prometheus no cluster

O exemplo de configuração do YAML a seguir implanta o StatsD e o Prometheus no cluster do Kubernetes em que um gateway auto-hospedado é implantado. Ele também cria um Serviço para cada. Em seguida, o gateway auto-hospedado publica métricas no Serviço StatsD. Acessaremos o painel do Prometheus por meio do serviço.

Observação

O exemplo a seguir efetua pull de imagens de contêiner públicas do Docker Hub. É recomendável configurar um segredo de pull para autenticar-se usando uma conta do Docker Hub em vez de fazer uma solicitação de pull anônima. Para aumentar a confiabilidade ao trabalhar com conteúdo público, importe e gerencie as imagens em um registro de contêiner privado do Azure. Saiba mais sobre como trabalhar com imagens públicas.

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

Salve as configurações em um arquivo chamado metrics.yaml. Use o seguinte comando para implantar tudo no cluster:

kubectl apply -f metrics.yaml

Quando a implantação terminar, execute o comando a seguir para verificar se os pods estão em execução. O nome do pod será diferente.

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

Execute o comando abaixo para verificar se os services estão em execução. Anote o CLUSTER-IP e a PORT do Serviço StatsD, que usaremos mais tarde. Você pode visitar o painel do Prometheus usando EXTERNAL-IP e 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

Configurar o gateway auto-hospedado para emitir métricas

Agora que o StatsD e o Prometheus foram implantados, podemos atualizar as configurações do gateway auto-hospedado para começar a emitir métricas por meio do StatsD. O recurso pode ser habilitado ou desabilitado usando a chave no telemetry.metrics.local ConfigMap da Implantação de gateway auto-hospedada com opções adicionais. A seguir estão as opções disponíveis:

Campo Padrão Descrição
telemetry.metrics.local none Habilita o registro em log por meio do StatsD. O valor pode ser none, statsd.
telemetry.metrics.local.statsd.endpoint N/D Especifica o ponto de extremidade de StatsD.
telemetry.metrics.local.statsd.sampling N/D Especifica a taxa de amostragem de métricas. O valor pode ser entre 0 e 1. Exemplo: 0.5
telemetry.metrics.local.statsd.tag-format N/D Formato de marcaçãode exportador do StatsD. O valor pode ser none, librato, dogStatsD, influxDB.

Veja um exemplo de configuração:

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"

Atualize o arquivo YAML da implantação de gateway de hospedagem interna com as configurações acima e aplique as alterações usando o comando abaixo:

kubectl apply -f <file-name>.yaml

Para obter as alterações de configuração mais recentes, reinicie a implantação de gateway usando o comando abaixo:

kubectl rollout restart deployment/<deployment-name>

Exibir as métricas

Agora que tudo está implantado e configurado, o gateway auto-hospedado deve relatar métricas por meio de StatsD. Em seguida, o Prometheus coleta as métricas do StatsD. Vá para o painel do Prometheus usando EXTERNAL-IP e PORT do serviço Prometheus.

Faça algumas chamadas à API por meio do gateway auto-hospedado, se tudo estiver configurado corretamente, você poderá exibir as métricas abaixo:

Métrica Descrição
requests_total Número de solicitações de API no período
request_duration_seconds Número de milissegundos do momento em que o gateway recebeu a solicitação até o momento em que a resposta foi enviada por completo
request_backend_duration_seconds Número de milissegundos gastos na E/S do back-end no total (conectando, enviando e recebendo bytes)
request_client_duration_seconds Número de milissegundos gastos na E/S geral do cliente (conectando, enviando e recebendo bytes)

Logs

O gateway auto-hospedado gera logs para stdout e stderr por padrão. Você pode exibir facilmente os logs usando o seguinte comando:

kubectl logs <pod-name>

Se o seu gateway auto-hospedado for implantado no Serviço de Kubernetes do Azure, você poderá habilitar Azure monitor para contêineres coletar stdout e stderr de suas cargas de trabalho e exibir os logs na análise de logs.

O gateway auto-hospedado também dá suporte a vários protocolos, incluindo localsyslog, rfc5424 e journal. A tabela a seguir resume todas as opções com suporte.

Campo Padrão Descrição
telemetry.logs.std text Habilita o registro em log em fluxos padrão. O valor pode ser none, text, json
telemetry.logs.local auto Habilita o registro em log local. O valor pode ser none, auto, localsyslog, rfc5424, journal, json
telemetry.logs.local.localsyslog.endpoint N/D Especifica o ponto de extremidade do syslog local. Para obter detalhes, confira Como usar logs do syslog local.
telemetry.logs.local.localsyslog.facility N/D Especifica o código de recurso do syslog local. Exemplo: 7
telemetry.logs.local.rfc5424.endpoint N/D Especifica o ponto de extremidade rfc5424.
telemetry.logs.local.rfc5424.facility N/D Especifica o código de instalação por rfc5424. Exemplo: 7
telemetry.logs.local.journal.endpoint N/D Especifica o ponto de extremidade do diário.
telemetry.logs.local.json.endpoint 127.0.0.1:8888 Especifica o ponto de extremidade UDP que aceita dados JSON: caminho do arquivo, IP:porta ou nome do host:porta.

Este é um exemplo de configuração do log local:

    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"

Como usar logs do syslog local

Como configurar o gateway para transmitir logs

Ao usar o syslog local como destino para logs, o runtime precisa permitir logs de streaming para o destino. No caso do Kubernetes, é necessário montar um volume que corresponda ao destino.

Considerando a seguinte configuração:

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

Você pode iniciar com facilidade os logs de streaming para esse ponto de extremidade do syslog local:

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

Como consumir os logs do syslog local no AKS (Serviço de Kubernetes do Azure)

Ao configurar o uso do syslog local no Serviço de Kubernetes do Azure, você pode escolher duas maneiras de explorar os logs:

Consumindo logs dos nós de trabalho

Você pode consumi-los facilmente obtendo acesso aos nós de trabalho:

  1. Criar uma conexão SSH para o nó (docs)
  2. Os logs podem ser encontrados em host/var/log/syslog

Por exemplo, você pode filtrar todos os syslogs apenas para os do gateway auto-hospedado:

$ 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"

Observação

Se você tiver alterado a raiz com chroot, por exemplo chroot /host, o caminho acima precisará refletir essa alteração.

Próximas etapas