exporter_type: sidecar
app_name_short: Jetty
app_name: {{app_name_short}}
app_site_name: {{app_name}}
app_site_url: https://www.eclipse.org/jetty/
exporter_name: the JMX exporter
exporter_pkg_name: jmx-exporter
exporter_repo_url: https://github.com/bitnami/containers/tree/main/bitnami/jmx-exporter
dashboard_available: true
minimum_exporter_version: "0.17.0"
multiple_dashboards: false
dashboard_display_name: {{app_name_short}} Prometheus Overview
config_mods: |
  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
---
podmonitoring_config: |
  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
sample_promql_query: up{job="jetty", cluster="{{cluster_name}}", namespace="{{namespace_name}}"}
alerts_config: |
  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
additional_alert_info: You can adjust the alert thresholds to suit your application.
