Jetty

Este documento descreve como configurar a implementação do Google Kubernetes Engine para que possa usar o Google Cloud Managed Service for Prometheus para recolher métricas do Jetty. Este documento mostra como fazer o seguinte:

  • Configure o exportador para o Jetty para comunicar métricas.
  • Aceda a um painel de controlo no Cloud Monitoring para ver as métricas.
  • Configure regras de alerta para monitorizar as métricas.

Estas instruções aplicam-se apenas se estiver a usar a recolha gerida com o serviço gerido para Prometheus. Se estiver a usar a recolha implementada automaticamente, consulte o repositório de origem para o exportador JMX para obter informações de instalação.

Estas instruções são fornecidas como exemplo e espera-se que funcionem na maioria dos ambientes do Kubernetes. Se estiver com problemas na instalação de uma aplicação ou de um exportador devido a políticas organizacionais ou de segurança restritivas, recomendamos que consulte a documentação de código aberto para receber apoio técnico.

Para mais informações sobre o Jetty, consulte Jetty.

Pré-requisitos

Para recolher métricas do Jetty através do Managed Service for Prometheus e da recolha gerida, a sua implementação tem de cumprir os seguintes requisitos:

  • O cluster tem de estar a executar a versão 1.28.15-gke.2475000 ou posterior do Google Kubernetes Engine.
  • Tem de estar a executar o Managed Service for Prometheus com a recolha gerida ativada. Para mais informações, consulte o artigo Comece a usar a recolha gerida.

  • Para usar os painéis de controlo disponíveis no Cloud Monitoring para a integração do Jetty, tem de usar a versão 0.17.0 ou posterior.jmx-exporter

    Para mais informações acerca dos painéis de controlo disponíveis, consulte o artigo Ver painéis de controlo.

Instale o exportador Jetty

Recomendamos que instale o exportador do Jetty, jmx-exporter, como um sidecar para a sua carga de trabalho do Jetty. Para ver informações sobre a utilização de sidecars, consulte o artigo Aplicações expandidas no Kubernetes com pods multicontentores.

Para instalar o jmx-exporter como um sidecar para o Jetty, modifique a configuração do Jetty, conforme mostrado no seguinte exemplo:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: ConfigMap
metadata:
  name: jetty-exporter
data:
  config.yaml: |
    hostPort: 127.0.0.1:1099
    rules:
    - pattern: "org.eclipse.jetty.deploy<(.*)><>(.*)"
      name: "jetty_deploy_$2"
      labels:
        labelList: "$1"
    - pattern: "org.eclipse.jetty.deploy.providers<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_deploy_providers_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.io<context=(.*), type=(.*), id=(\\d+)><>(\\w+)"
      name: "jetty_io_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.io<type=(.*), id=(\\d+)><>(\\w+)"
      name: "jetty_io_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.jmx<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_jmx_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.logging<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_logging_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.server<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_server_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.server<context=(.*), type=(.*), id=(\\d+)><>(\\w+)"
      name: "jetty_server_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.server.handler<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_server_handler_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.server.session<type=(.*), id=(\\d+)><>(\\w+)"
      name: "jetty_server_session_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.server.session<context=(.*), type=(.*), id=(\\d+)><>(\\w+)"
      name: "jetty_server_session_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.util<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_util_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.util.component<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_util_component_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.servlet<context=(.*), type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_servlet_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.servlet<context=(.*), type=(\\w+), name=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_servlet_$5"
      labels:
        id: "$4"
        type: "$2"
        name: "$3"
        context: "$1"
    - pattern: "org.eclipse.jetty.util.thread<type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_util_thread_$3"
      labels:
        id: "$2"
        type: "$1"
    - pattern: "org.eclipse.jetty.util.thread.strategy<context=(.*), type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_util_thread_strategy_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.webapp<context=(.*), type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_webapp_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.websocket.common<context=(.*), type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_websocket_jakarta_common_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.websocket.jakarta.common<context=(.*), type=(\\w+), id=(\\d+)><>(\\w+)"
      name: "jetty_websocket_jakarta_common_$4"
      labels:
        id: "$3"
        type: "$2"
        context: "$1"
    - pattern: "org.eclipse.jetty.(.*)"
      name: jetty_metric_$1
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jetty
spec:
  selector:
    matchLabels:
+      app.kubernetes.io/name: jetty
  replicas: 1
  template:
    metadata:
      labels:
+        app.kubernetes.io/name: jetty
    spec:
      containers:
      - name: jetty
        image: jetty:11-jdk17-alpine
+        ports:
+        - containerPort: 1099
+          name: jmx
+        env:
+        - name: JAVA_OPTIONS
+          value: "-Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099"
+        args:
+        - "--module=jmx"
+        - "jetty.threadPool.maxThreads=500"
+      - name: exporter
+        image: bitnami/jmx-exporter:0.17.0
+        ports:
+        - containerPort: 9000
+          name: prometheus
+        command:
+          - java
+          - -jar
+          - jmx_prometheus_httpserver.jar
+        args:
+          - "9000"
+          - /opt/jmx_exporter/config.yaml
+        volumeMounts:
+        - mountPath: /opt/jmx_exporter/config.yaml
+          subPath: config.yaml
+          name: jetty-exporter
+      volumes:
+      - name: jetty-exporter
+        configMap:
+          name: jetty-exporter
+          items:
+          - key: config.yaml
+            path: config.yaml
---

Tem de adicionar todas as linhas precedidas pelo símbolo + à sua configuração.

Para aplicar alterações de configuração a partir de um ficheiro local, execute o seguinte comando:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Também pode usar o Terraform para gerir as suas configurações.

Defina um recurso PodMonitoring

Para a deteção de destinos, o operador do Managed Service for Prometheus requer um recurso PodMonitoring que corresponda ao exportador JMX no mesmo espaço de nomes.

Pode usar a seguinte configuração PodMonitoring:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: PodMonitoring
metadata:
  name: jetty
  labels:
    app.kubernetes.io/name: jetty
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  endpoints:
  - port: prometheus
    scheme: http
    interval: 30s
    path: /metrics
  selector:
    matchLabels:
      app.kubernetes.io/name: jetty

Certifique-se de que os seletores de etiquetas e a porta correspondem aos seletores e à porta usados em Instale o exportador Jetty.

Para aplicar alterações de configuração a partir de um ficheiro local, execute o seguinte comando:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Também pode usar o Terraform para gerir as suas configurações.

Defina regras e alertas

Pode usar a seguinte configuração Rules para definir alertas nas suas métricas do Jetty:

# Copyright 2023 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: monitoring.googleapis.com/v1
kind: Rules
metadata:
  name: jetty-rules
  labels:
    app.kubernetes.io/component: rules
    app.kubernetes.io/name: jetty-rules
    app.kubernetes.io/part-of: google-cloud-managed-prometheus
spec:
  groups:
  - name: jetty
    interval: 30s
    rules:
    - alert: JettyLongThreadQueue
      annotations:
        description: |-
          Jetty long thread queue
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Jetty long thread queue (instance {{ $labels.instance }})
      expr: jetty_util_thread_queueSize >= 10
      for: 5m
      labels:
        severity: critical
    - alert: JettyNoThreadsAvailable
      annotations:
        description: |-
          Jetty no threads available
            VALUE = {{ $value }}
            LABELS: {{ $labels }}
        summary: Jetty no threads available (instance {{ $labels.instance }})
      expr: jetty_util_thread_idleThreads == 0
      for: 5m
      labels:
        severity: critical

Para aplicar alterações de configuração a partir de um ficheiro local, execute o seguinte comando:

kubectl apply -n NAMESPACE_NAME -f FILE_NAME

Também pode usar o Terraform para gerir as suas configurações.

Para mais informações sobre a aplicação de regras ao seu cluster, consulte o artigo Avaliação e alertas de regras geridas.

Pode ajustar os limites de alerta de acordo com a sua aplicação.

Valide a configuração

Pode usar o Explorador de métricas para verificar se configurou corretamente o exportador JMX. O Cloud Monitoring pode demorar um ou dois minutos a carregar as suas métricas.

Para verificar se as métricas são carregadas, faça o seguinte:

  1. Na Google Cloud consola, aceda à página  Explorador de métricas:

    Aceda ao Metrics Explorer

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cujo subtítulo é Monitorização.

  2. Na barra de ferramentas do painel do criador de consultas, selecione o botão cujo nome é  MQL ou  PromQL.
  3. Verifique se a opção PromQL está selecionada no botão Idioma. O botão para alternar o idioma encontra-se na mesma barra de ferramentas que lhe permite formatar a consulta.
  4. Introduza e execute a seguinte consulta:
    up{job="jetty", cluster="CLUSTER_NAME", namespace="NAMESPACE_NAME"}

Veja painéis de controlo

A integração do Cloud Monitoring inclui o painel de controlo Vista geral do Jetty Prometheus. Os painéis de controlo são instalados automaticamente quando configura a integração. Também pode ver pré-visualizações estáticas de painéis de controlo sem instalar a integração.

Para ver um painel de controlo instalado, faça o seguinte:

  1. Na Google Cloud consola, aceda à página  Painéis de controlo:

    Aceda a Painéis de controlo

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cujo subtítulo é Monitorização.

  2. Selecione o separador Lista do painel de controlo.
  3. Escolha a categoria Integrações.
  4. Clique no nome do painel de controlo, por exemplo, Vista geral do Jetty Prometheus.

Para ver uma pré-visualização estática do painel de controlo, faça o seguinte:

  1. Na Google Cloud consola, aceda à página  Integrações:

    Aceda a Integrações

    Se usar a barra de pesquisa para encontrar esta página, selecione o resultado cujo subtítulo é Monitorização.

  2. Clique no filtro de plataforma de implementação Kubernetes Engine.
  3. Localize a integração do Jetty e clique em Ver detalhes.
  4. Selecione o separador Painéis de controlo.

Resolução de problemas

Para informações sobre a resolução de problemas de carregamento de métricas, consulte a secção Problemas com a recolha de exportadores em Resolução de problemas do lado do carregamento.