├── .gitignore ├── chap10 ├── exporter_basics │ ├── go.mod │ ├── main.go │ └── go.sum ├── exporter_count │ ├── go.mod │ ├── main.go │ └── go.sum ├── exporter_template │ ├── go.mod │ ├── main.go │ └── go.sum └── exporter_mysql │ ├── go.mod │ ├── query.sql │ ├── main.go │ └── go.sum ├── chap07 ├── grafana │ └── data │ │ └── grafana.db ├── prometheus │ └── prometheus.yml └── docker-compose.yml ├── chap08 ├── kubernetes_sd_configs │ ├── README.md │ ├── cluster.yaml │ ├── node-exporter.yaml │ └── prometheus.yaml ├── system-components │ ├── README.md │ └── cluster.yaml ├── prometheus-operator │ ├── README.md │ ├── manifests │ │ ├── prometheus │ │ │ ├── prometheus-serviceAccount.yaml │ │ │ ├── prometheus-roleConfig.yaml │ │ │ ├── prometheus-clusterRole.yaml │ │ │ ├── prometheus-clusterRoleBinding.yaml │ │ │ ├── prometheus-roleBindingConfig.yaml │ │ │ ├── prometheus-podDisruptionBudget.yaml │ │ │ ├── prometheus-service.yaml │ │ │ ├── prometheus-prometheus.yaml │ │ │ ├── prometheus-roleBindingSpecificNamespaces.yaml │ │ │ └── prometheus-roleSpecificNamespaces.yaml │ │ ├── setup │ │ │ ├── prometheus-operator-serviceAccount.yaml │ │ │ ├── prometheus-operator-clusterRoleBinding.yaml │ │ │ ├── prometheus-operator-service.yaml │ │ │ ├── prometheus-operator-clusterRole.yaml │ │ │ ├── prometheus-operator-deployment.yaml │ │ │ └── prometheus-operator-0prometheusruleCustomResourceDefinition.yaml │ │ ├── alertmanager │ │ │ ├── alertmanager-serviceAccount.yaml │ │ │ ├── alertmanager-podDisruptionBudget.yaml │ │ │ ├── alertmanager-service.yaml │ │ │ ├── alertmanager-alertmanager.yaml │ │ │ ├── alertmanager-secret.yaml │ │ │ └── alertmanager-prometheusRule.yaml │ │ ├── servicemonitor │ │ │ ├── kubernetes-serviceMonitorCoreDNS.yaml │ │ │ ├── prometheus-serviceMonitor.yaml │ │ │ ├── alertmanager-serviceMonitor.yaml │ │ │ ├── kubernetes-serviceMonitorKubeScheduler.yaml │ │ │ ├── prometheus-operator-serviceMonitor.yaml │ │ │ ├── kubernetes-serviceMonitorKubeControllerManager.yaml │ │ │ ├── kubernetes-serviceMonitorApiserver.yaml │ │ │ └── kubernetes-serviceMonitorKubelet.yaml │ │ └── rules │ │ │ ├── kube-prometheus-prometheusRule.yaml │ │ │ ├── prometheus-operator-prometheusRule.yaml │ │ │ └── prometheus-prometheusRule.yaml │ └── cluster.yaml └── kubernetes_monitoring │ ├── cluster.yaml │ ├── prometheus.yaml │ └── kube-state-metrics.yaml ├── chap12 ├── victoriametrics │ ├── grafana │ │ └── data │ │ │ └── grafana.db │ ├── prometheus.yml │ └── docker-compose.yml ├── grafana-loki │ ├── prometheus.yml │ └── docker-compose.yml └── pushgateway │ ├── prometheus.yml │ └── docker-compose.yml ├── chap04 ├── mysql │ ├── mysql │ │ └── init.sql │ ├── prometheus.yml │ └── docker-compose.yml └── apache │ ├── prometheus.yml │ ├── docker-compose.yml │ └── httpd.conf ├── chap02 ├── docker-compose │ ├── prometheus.yml │ └── docker-compose.yml ├── systemd │ ├── prometheus.yml │ ├── docker-compose.yml │ └── prometheus.service └── alertmanager │ ├── prometheus.yml │ ├── alertmanager.yml │ └── docker-compose.yml ├── chap11 └── remote_write_receiver │ ├── prometheus-dst.yml │ ├── prometheus-src.yml │ └── docker-compose.yml ├── chap06 ├── alert_basic │ ├── prometheus │ │ ├── alert_rules.yml │ │ └── prometheus.yml │ ├── docker-compose.yml │ └── alertmanager │ │ └── alertmanager.yml ├── alert_mail │ ├── prometheus │ │ ├── alert_rules.yml │ │ └── prometheus.yml │ ├── alertmanager │ │ └── alertmanager.yml │ └── docker-compose.yml └── alert_slack │ ├── prometheus │ ├── alert_rules.yml │ └── prometheus.yml │ ├── docker-compose.yml │ └── alertmanager │ └── alertmanager.yml ├── chap03 └── gce_configs │ ├── prometheus.yml │ └── docker-compose.yml ├── chap09 ├── influxdb │ ├── prometheus.yml │ └── docker-compose.yml └── victoriametrics │ ├── prometheus.yml │ └── docker-compose.yml ├── chap05 ├── docker-compose.yml ├── prometheus.yml └── blackbox.yml └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | /bin -------------------------------------------------------------------------------- /chap10/exporter_basics/go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.16 4 | 5 | require github.com/prometheus/client_golang v1.11.0 6 | -------------------------------------------------------------------------------- /chap10/exporter_count/go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.16 4 | 5 | require github.com/prometheus/client_golang v1.11.0 6 | -------------------------------------------------------------------------------- /chap07/grafana/data/grafana.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TakumaNakagame/prometheus-book/HEAD/chap07/grafana/data/grafana.db -------------------------------------------------------------------------------- /chap10/exporter_template/go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.16 4 | 5 | require github.com/prometheus/client_golang v1.11.0 6 | -------------------------------------------------------------------------------- /chap08/kubernetes_sd_configs/README.md: -------------------------------------------------------------------------------- 1 | ## Create Cluster 2 | ``` 3 | $ kind create cluster --name prom-k8s-sd --config cluster.yaml 4 | ``` -------------------------------------------------------------------------------- /chap08/system-components/README.md: -------------------------------------------------------------------------------- 1 | ## Create Cluster 2 | ``` 3 | $ kind create cluster --name prom-k8s-sys --config cluster.yaml 4 | ``` -------------------------------------------------------------------------------- /chap12/victoriametrics/grafana/data/grafana.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TakumaNakagame/prometheus-book/HEAD/chap12/victoriametrics/grafana/data/grafana.db -------------------------------------------------------------------------------- /chap10/exporter_mysql/go.mod: -------------------------------------------------------------------------------- 1 | module main 2 | 3 | go 1.16 4 | 5 | require ( 6 | github.com/go-sql-driver/mysql v1.6.0 7 | github.com/prometheus/client_golang v1.11.0 8 | ) 9 | -------------------------------------------------------------------------------- /chap04/mysql/mysql/init.sql: -------------------------------------------------------------------------------- 1 | CREATE USER 'exporter'@'%' IDENTIFIED BY 'password'; 2 | GRANT PROCESS, REPLICATION CLIENT ON *.* TO 'exporter'@'%'; 3 | GRANT SELECT ON performance_schema.* TO 'exporter'@'%'; -------------------------------------------------------------------------------- /chap08/prometheus-operator/README.md: -------------------------------------------------------------------------------- 1 | ## 本マニフェストについて 2 | 3 | ここで紹介しているリポジトリは、以下のリポジトリからコピーしてきたものになります。 4 | より最新のファイルを利用したい場合は、このリポジトリを参照してください。 5 | 6 | https://github.com/prometheus-operator/kube-prometheus -------------------------------------------------------------------------------- /chap12/grafana-loki/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | -------------------------------------------------------------------------------- /chap02/docker-compose/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | -------------------------------------------------------------------------------- /chap11/remote_write_receiver/prometheus-dst.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus-dst' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | -------------------------------------------------------------------------------- /chap02/docker-compose/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | -------------------------------------------------------------------------------- /chap06/alert_basic/prometheus/alert_rules.yml: -------------------------------------------------------------------------------- 1 | --- 2 | groups: 3 | - name: example 4 | rules: 5 | - alert: Target Down 6 | expr: up == 0 7 | for: 10s 8 | labels: 9 | severity: critical 10 | annotations: 11 | summary: Prometheus Target Down 12 | -------------------------------------------------------------------------------- /chap06/alert_mail/prometheus/alert_rules.yml: -------------------------------------------------------------------------------- 1 | --- 2 | groups: 3 | - name: example 4 | rules: 5 | - alert: Target Down 6 | expr: up == 0 7 | for: 10s 8 | labels: 9 | severity: critical 10 | annotations: 11 | summary: Prometheus Target Down 12 | -------------------------------------------------------------------------------- /chap06/alert_slack/prometheus/alert_rules.yml: -------------------------------------------------------------------------------- 1 | --- 2 | groups: 3 | - name: example 4 | rules: 5 | - alert: Target Down 6 | expr: up == 0 7 | for: 10s 8 | labels: 9 | severity: critical 10 | annotations: 11 | summary: Prometheus Target Down 12 | -------------------------------------------------------------------------------- /chap04/mysql/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'mysql' 11 | static_configs: 12 | - targets: ["mysql_exporter:9104"] 13 | -------------------------------------------------------------------------------- /chap04/apache/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'apache' 11 | static_configs: 12 | - targets: ["apache_exporter:9117"] 13 | -------------------------------------------------------------------------------- /chap07/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | -------------------------------------------------------------------------------- /chap02/systemd/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | alerting: 7 | alertmanagers: 8 | - static_configs: 9 | - targets: [localhost:9093] 10 | 11 | scrape_configs: 12 | - job_name: 'prometheus' 13 | static_configs: 14 | - targets: ["localhost:9090"] 15 | -------------------------------------------------------------------------------- /chap02/alertmanager/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | alerting: 7 | alertmanagers: 8 | - static_configs: 9 | - targets: [alertmanager:9093] 10 | 11 | scrape_configs: 12 | - job_name: 'prometheus' 13 | static_configs: 14 | - targets: ["localhost:9090"] 15 | -------------------------------------------------------------------------------- /chap02/systemd/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | alertmanager: 11 | image: prom/alertmanager:v0.23.0 12 | ports: 13 | - '9093:9093' 14 | -------------------------------------------------------------------------------- /chap12/pushgateway/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'pushgateway' 11 | honor_labels: true 12 | static_configs: 13 | - targets: ["pushgateway:9091"] 14 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-serviceAccount.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s 10 | namespace: default 11 | -------------------------------------------------------------------------------- /chap06/alert_basic/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - ./prometheus:/etc/prometheus 10 | alertmanager: 11 | image: prom/alertmanager:v0.23.0 12 | ports: 13 | - '9093:9093' 14 | volumes: 15 | - ./alertmanager:/etc/alertmanager 16 | -------------------------------------------------------------------------------- /chap06/alert_slack/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3.3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - ./prometheus:/etc/prometheus 10 | alertmanager: 11 | image: prom/alertmanager:v0.23.0 12 | ports: 13 | - '9093:9093' 14 | volumes: 15 | - ./alertmanager:/etc/alertmanager 16 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-serviceAccount.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | namespace: default 11 | -------------------------------------------------------------------------------- /chap11/remote_write_receiver/prometheus-src.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus-src' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | 14 | remote_write: 15 | - url: http://prom-dst:9090/api/v1/write 16 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-serviceAccount.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | labels: 5 | alertmanager: main 6 | app.kubernetes.io/component: alert-router 7 | app.kubernetes.io/name: alertmanager 8 | app.kubernetes.io/part-of: kube-prometheus 9 | app.kubernetes.io/version: 0.22.2 10 | name: alertmanager-main 11 | namespace: default 12 | -------------------------------------------------------------------------------- /chap03/gce_configs/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'gce_instance' 11 | gce_sd_configs: 12 | - project: 'promethues-book' 13 | zone: us-central1-f 14 | - project: 'promethues-book' 15 | zone: us-west1-c 16 | -------------------------------------------------------------------------------- /chap02/alertmanager/alertmanager.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | resolve_timeout: 5m 4 | smtp_from: alertmanager@example.com 5 | smtp_smarthost: mailhog:1025 6 | 7 | route: 8 | group_by: ['alertname'] 9 | group_wait: 10s 10 | group_interval: 10s 11 | repeat_interval: 1h 12 | receiver: 'email' 13 | receivers: 14 | - name: 'email' 15 | email_configs: 16 | - to: test@example.com 17 | require_tls: false 18 | -------------------------------------------------------------------------------- /chap06/alert_mail/alertmanager/alertmanager.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | resolve_timeout: 5m 4 | smtp_from: alertmanager@example.com 5 | smtp_smarthost: mailhog:1025 6 | 7 | route: 8 | group_by: ['alertname'] 9 | group_wait: 10s 10 | group_interval: 10s 11 | repeat_interval: 1h 12 | receiver: 'email' 13 | receivers: 14 | - name: 'email' 15 | email_configs: 16 | - to: test@example.com 17 | require_tls: false 18 | -------------------------------------------------------------------------------- /chap03/gce_configs/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | - '$HOME/.config/gcloud/application_default_credentials.json:/prometheus/credentials/gcp.json' 11 | environment: 12 | - GOOGLE_APPLICATION_CREDENTIALS=/prometheus/credentials/gcp.json 13 | -------------------------------------------------------------------------------- /chap06/alert_basic/alertmanager/alertmanager.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | resolve_timeout: 5m 4 | 5 | route: 6 | group_by: ['alertname'] 7 | group_wait: 10s 8 | group_interval: 10s 9 | repeat_interval: 1h 10 | receiver: 'sample' 11 | receivers: 12 | - name: 'sample' 13 | inhibit_rules: 14 | - source_match: 15 | severity: 'critical' 16 | target_match: 17 | severity: 'warning' 18 | equal: ['alertname', 'dev', 'instance'] 19 | -------------------------------------------------------------------------------- /chap12/pushgateway/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | pushgateway: 14 | image: prom/pushgateway:v1.4.2 15 | ports: 16 | - '9091:9091' 17 | -------------------------------------------------------------------------------- /chap06/alert_mail/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - ./prometheus:/etc/prometheus 10 | alertmanager: 11 | image: prom/alertmanager:v0.23.0 12 | ports: 13 | - '9093:9093' 14 | volumes: 15 | - ./alertmanager:/etc/alertmanager 16 | mailhog: 17 | image: mailhog/mailhog:v1.0.1 18 | ports: 19 | - '8025:8025' 20 | -------------------------------------------------------------------------------- /chap09/influxdb/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | 14 | remote_read: 15 | - url: http://influxdb:8086/api/v1/prom/read?db=prometheus 16 | remote_write: 17 | - url: http://influxdb:8086/api/v1/prom/write?db=prometheus 18 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-roleConfig.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: Role 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s-config 10 | namespace: default 11 | rules: 12 | - apiGroups: 13 | - "" 14 | resources: 15 | - configmaps 16 | verbs: 17 | - get 18 | -------------------------------------------------------------------------------- /chap09/victoriametrics/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | - job_name: 'victoriametrics' 14 | static_configs: 15 | - targets: ["victoriametrics:8428"] 16 | 17 | remote_write: 18 | - url: http://victoriametrics:8428/api/v1/write 19 | -------------------------------------------------------------------------------- /chap02/systemd/prometheus.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=prometheus-stack 3 | 4 | [Service] 5 | ExecStart=/usr/local/bin/docker-compose -p prometheus-stack -f /opt/prometheus-stack/docker-compose.yml up 6 | ExecStop=/usr/local/bin/docker-compose -p prometheus-stack -f /opt/prometheus-stack/docker-compose.yml down -v 7 | ExecReload=/usr/local/bin/docker-compose -p prometheus-stack -f /opt/prometheus-stack/docker-compose.yml restart 8 | Restart=always 9 | 10 | Type=simple 11 | 12 | [Install] 13 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /chap12/victoriametrics/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | - job_name: 'victoriametrics' 14 | static_configs: 15 | - targets: ["victoriametrics:8428"] 16 | 17 | # remote_write: 18 | # - url: http://victoriametrics:8428/api/v1/write 19 | -------------------------------------------------------------------------------- /chap06/alert_mail/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | alerting: 7 | alertmanagers: 8 | - static_configs: 9 | - targets: 10 | - alertmanager:9093 11 | 12 | rule_files: 13 | - '/etc/prometheus/alert_rules.yml' 14 | 15 | scrape_configs: 16 | - job_name: 'prometheus' 17 | static_configs: 18 | - targets: ['localhost:9090'] 19 | - job_name: 'server' 20 | static_configs: 21 | - targets: ['localhost:9100'] 22 | -------------------------------------------------------------------------------- /chap06/alert_slack/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | alerting: 7 | alertmanagers: 8 | - static_configs: 9 | - targets: 10 | - alertmanager:9093 11 | 12 | rule_files: 13 | - '/etc/prometheus/alert_rules.yml' 14 | 15 | scrape_configs: 16 | - job_name: 'prometheus' 17 | static_configs: 18 | - targets: ['localhost:9090'] 19 | - job_name: 'server' 20 | static_configs: 21 | - targets: ['localhost:9100'] 22 | -------------------------------------------------------------------------------- /chap02/alertmanager/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | alertmanager: 11 | image: prom/alertmanager:v0.23.0 12 | ports: 13 | - '9093:9093' 14 | volumes: 15 | - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml 16 | mailhog: 17 | image: mailhog/mailhog:v1.0.1 18 | ports: 19 | - '8025:8025' 20 | -------------------------------------------------------------------------------- /chap06/alert_basic/prometheus/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | alerting: 7 | alertmanagers: 8 | - static_configs: 9 | - targets: 10 | - alertmanager:9093 11 | 12 | rule_files: 13 | - '/etc/prometheus/alert_rules.yml' 14 | 15 | scrape_configs: 16 | - job_name: 'prometheus' 17 | static_configs: 18 | - targets: ['localhost:9090'] 19 | # - job_name: 'server' 20 | # static_configs: 21 | # - targets: ['localhost:9100'] 22 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-clusterRole.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s 10 | rules: 11 | - apiGroups: 12 | - "" 13 | resources: 14 | - nodes/metrics 15 | verbs: 16 | - get 17 | - nonResourceURLs: 18 | - /metrics 19 | verbs: 20 | - get 21 | -------------------------------------------------------------------------------- /chap06/alert_slack/alertmanager/alertmanager.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | resolve_timeout: 5m 4 | 5 | route: 6 | group_by: ['alertname'] 7 | group_wait: 10s 8 | group_interval: 10s 9 | repeat_interval: 1h 10 | receiver: 'slack' 11 | receivers: 12 | - name: 'slack' 13 | slack_configs: 14 | - api_url: https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXX 15 | inhibit_rules: 16 | - source_match: 17 | severity: 'critical' 18 | target_match: 19 | severity: 'warning' 20 | equal: ['alertname', 'dev', 'instance'] 21 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/kubernetes-serviceMonitorCoreDNS.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: coredns 6 | name: coredns 7 | namespace: default 8 | spec: 9 | endpoints: 10 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 11 | interval: 15s 12 | port: metrics 13 | jobLabel: app.kubernetes.io/name 14 | namespaceSelector: 15 | matchNames: 16 | - kube-system 17 | selector: 18 | matchLabels: 19 | k8s-app: kube-dns 20 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-clusterRoleBinding.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRoleBinding 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s 10 | roleRef: 11 | apiGroup: rbac.authorization.k8s.io 12 | kind: ClusterRole 13 | name: prometheus-k8s 14 | subjects: 15 | - kind: ServiceAccount 16 | name: prometheus-k8s 17 | namespace: default 18 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-roleBindingConfig.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: RoleBinding 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s-config 10 | namespace: default 11 | roleRef: 12 | apiGroup: rbac.authorization.k8s.io 13 | kind: Role 14 | name: prometheus-k8s-config 15 | subjects: 16 | - kind: ServiceAccount 17 | name: prometheus-k8s 18 | namespace: default 19 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-clusterRoleBinding.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRoleBinding 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | roleRef: 11 | apiGroup: rbac.authorization.k8s.io 12 | kind: ClusterRole 13 | name: prometheus-operator 14 | subjects: 15 | - kind: ServiceAccount 16 | name: prometheus-operator 17 | namespace: default 18 | -------------------------------------------------------------------------------- /chap08/kubernetes_monitoring/cluster.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | kind: Cluster 4 | nodes: 5 | - role: control-plane 6 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 7 | - role: worker 8 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 9 | - role: worker 10 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 11 | - role: worker 12 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 13 | -------------------------------------------------------------------------------- /chap08/kubernetes_sd_configs/cluster.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | kind: Cluster 4 | nodes: 5 | - role: control-plane 6 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 7 | - role: worker 8 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 9 | - role: worker 10 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 11 | - role: worker 12 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 13 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/cluster.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | kind: Cluster 4 | nodes: 5 | - role: control-plane 6 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 7 | - role: worker 8 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 9 | - role: worker 10 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 11 | - role: worker 12 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 13 | -------------------------------------------------------------------------------- /chap08/system-components/cluster.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | apiVersion: kind.x-k8s.io/v1alpha4 3 | kind: Cluster 4 | nodes: 5 | - role: control-plane 6 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 7 | - role: worker 8 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 9 | - role: worker 10 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 11 | - role: worker 12 | image: kindest/node:v1.20.7@sha256:cbeaf907fc78ac97ce7b625e4bf0de16e3ea725daf6b04f930bd14c67c671ff9 13 | -------------------------------------------------------------------------------- /chap05/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | node-exporter: 14 | image: prom/node-exporter:v1.3.1 15 | ports: 16 | - '9100:9100' 17 | blackbox-exporter: 18 | image: prom/blackbox-exporter:v0.19.0 19 | ports: 20 | - '9115:9115' 21 | volumes: 22 | - ./blackbox.yml:/etc/blackbox_exporter/config.yml 23 | -------------------------------------------------------------------------------- /chap07/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus/prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | node-exporter: 14 | image: prom/node-exporter:v1.3.1 15 | hostname: prometheus-book 16 | ports: 17 | - '9100:9100' 18 | grafana: 19 | image: grafana/grafana:8.3.6 20 | ports: 21 | - 3000:3000 22 | volumes: 23 | - ./grafana/data:/var/lib/grafana 24 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-podDisruptionBudget.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1beta1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s 10 | namespace: default 11 | spec: 12 | minAvailable: 1 13 | selector: 14 | matchLabels: 15 | app.kubernetes.io/component: prometheus 16 | app.kubernetes.io/name: prometheus 17 | app.kubernetes.io/part-of: kube-prometheus 18 | prometheus: k8s 19 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | namespace: default 11 | spec: 12 | clusterIP: None 13 | ports: 14 | - name: https 15 | port: 8443 16 | targetPort: https 17 | selector: 18 | app.kubernetes.io/component: controller 19 | app.kubernetes.io/name: prometheus-operator 20 | app.kubernetes.io/part-of: kube-prometheus 21 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-podDisruptionBudget.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: policy/v1beta1 2 | kind: PodDisruptionBudget 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: alert-router 6 | app.kubernetes.io/name: alertmanager 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.22.2 9 | name: alertmanager-main 10 | namespace: default 11 | spec: 12 | maxUnavailable: 1 13 | selector: 14 | matchLabels: 15 | alertmanager: main 16 | app.kubernetes.io/component: alert-router 17 | app.kubernetes.io/name: alertmanager 18 | app.kubernetes.io/part-of: kube-prometheus 19 | -------------------------------------------------------------------------------- /chap10/exporter_mysql/query.sql: -------------------------------------------------------------------------------- 1 | -- データベースの作成 2 | create database handson; 3 | 4 | -- 作成したデータベースの確認 5 | show databases; 6 | 7 | -- データベースの選択 8 | use handson; 9 | 10 | -- テーブルの作成 IDをプライマリキーとして設定 11 | create table handson.metrics ( 12 | id int primary key auto_increment, 13 | metrics_name varchar(100), 14 | value int 15 | ); 16 | 17 | -- 作成したテーブルの確認 18 | show tables; 19 | 20 | -- テーブルのスキーマの確認 21 | show columns from handson.metrics; 22 | 23 | -- メトリクス用のデータを追加 24 | insert into handson.metrics(metrics_name, value) value ('sample_metrics', 1); 25 | 26 | -- 追加したデータの確認 27 | select * from handson.metrics; 28 | 29 | -- 追加したデータの値を更新 30 | update handson.metrics set value=2 where id=1; -------------------------------------------------------------------------------- /chap04/apache/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | httpd: 14 | image: httpd:2.4 15 | ports: 16 | - '80:80' 17 | volumes: 18 | - './httpd.conf:/usr/local/apache2/conf/httpd.conf' 19 | apache_exporter: 20 | image: bitnami/apache-exporter:0.8.0 21 | ports: 22 | - '9117:9117' 23 | command: 24 | --scrape_uri="http://httpd/server-status/?auto" 25 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/prometheus-serviceMonitor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | name: prometheus-k8s 10 | namespace: default 11 | spec: 12 | endpoints: 13 | - interval: 30s 14 | port: web 15 | selector: 16 | matchLabels: 17 | app.kubernetes.io/component: prometheus 18 | app.kubernetes.io/name: prometheus 19 | app.kubernetes.io/part-of: kube-prometheus 20 | prometheus: k8s 21 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/alertmanager-serviceMonitor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: alert-router 6 | app.kubernetes.io/name: alertmanager 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.22.2 9 | name: alertmanager 10 | namespace: default 11 | spec: 12 | endpoints: 13 | - interval: 30s 14 | port: web 15 | selector: 16 | matchLabels: 17 | alertmanager: main 18 | app.kubernetes.io/component: alert-router 19 | app.kubernetes.io/name: alertmanager 20 | app.kubernetes.io/part-of: kube-prometheus 21 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/kubernetes-serviceMonitorKubeScheduler.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-scheduler 6 | name: kube-scheduler 7 | namespace: default 8 | spec: 9 | endpoints: 10 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 11 | interval: 30s 12 | port: https-metrics 13 | scheme: https 14 | tlsConfig: 15 | insecureSkipVerify: true 16 | jobLabel: app.kubernetes.io/name 17 | namespaceSelector: 18 | matchNames: 19 | - kube-system 20 | selector: 21 | matchLabels: 22 | app.kubernetes.io/name: kube-scheduler 23 | -------------------------------------------------------------------------------- /chap09/influxdb/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | node-exporter: 14 | image: prom/node-exporter:v1.3.1 15 | ports: 16 | - '9100:9100' 17 | influxdb: 18 | image: influxdb:1.8.5 19 | ports: 20 | - '8086:8086' 21 | volumes: 22 | - 'influxdb:/var/lib/influxdb' 23 | environment: 24 | INFLUXDB_DB: prometheus 25 | 26 | volumes: 27 | influxdb: 28 | driver: local 29 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | prometheus: k8s 10 | name: prometheus-k8s 11 | namespace: default 12 | spec: 13 | ports: 14 | - name: web 15 | port: 9090 16 | targetPort: web 17 | selector: 18 | app: prometheus 19 | app.kubernetes.io/component: prometheus 20 | app.kubernetes.io/name: prometheus 21 | app.kubernetes.io/part-of: kube-prometheus 22 | prometheus: k8s 23 | sessionAffinity: ClientIP 24 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-service.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | labels: 5 | alertmanager: main 6 | app.kubernetes.io/component: alert-router 7 | app.kubernetes.io/name: alertmanager 8 | app.kubernetes.io/part-of: kube-prometheus 9 | app.kubernetes.io/version: 0.22.2 10 | name: alertmanager-main 11 | namespace: default 12 | spec: 13 | ports: 14 | - name: web 15 | port: 9093 16 | targetPort: web 17 | selector: 18 | alertmanager: main 19 | app: alertmanager 20 | app.kubernetes.io/component: alert-router 21 | app.kubernetes.io/name: alertmanager 22 | app.kubernetes.io/part-of: kube-prometheus 23 | sessionAffinity: ClientIP 24 | -------------------------------------------------------------------------------- /chap04/mysql/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | mysql: 14 | image: mysql:8.0.23 15 | ports: 16 | - '3306:3306' 17 | environment: 18 | - MYSQL_ROOT_PASSWORD=password 19 | volumes: 20 | - ./mysql:/docker-entrypoint-initdb.d 21 | mysql_exporter: 22 | image: prom/mysqld-exporter:v0.12.1 23 | ports: 24 | - '9104:9104' 25 | environment: 26 | - DATA_SOURCE_NAME=exporter:password@(mysql:3306)/ 27 | -------------------------------------------------------------------------------- /chap11/remote_write_receiver/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prom-src: 5 | container_name: prometheus-src 6 | image: prom/prometheus:v2.33.3 7 | ports: 8 | - '9091:9090' 9 | volumes: 10 | - './prometheus-src.yml:/etc/prometheus/prometheus.yml' 11 | command: 12 | --config.file=/etc/prometheus/prometheus.yml 13 | prom-dst: 14 | container_name: prometheus-dst 15 | image: prom/prometheus:v2.33.3 16 | ports: 17 | - '9092:9090' 18 | volumes: 19 | - './prometheus-dst.yml:/etc/prometheus/prometheus.yml' 20 | command: 21 | --web.enable-remote-write-receiver 22 | --config.file=/etc/prometheus/prometheus.yml 23 | node-exporter: 24 | container_name: node-exporter 25 | image: prom/node-exporter:v1.3.1 26 | ports: 27 | - '9100:9100' 28 | -------------------------------------------------------------------------------- /chap05/prometheus.yml: -------------------------------------------------------------------------------- 1 | --- 2 | global: 3 | scrape_interval: 15s 4 | evaluation_interval: 15s 5 | 6 | scrape_configs: 7 | - job_name: 'prometheus' 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | - job_name: 'node' 11 | static_configs: 12 | - targets: ["node-exporter:9100"] 13 | relabel_configs: 14 | - target_label: cluster 15 | replacement: cluster-01 16 | - job_name: 'prom_blackbox' 17 | metrics_path: /probe 18 | params: 19 | module: [http_2xx] 20 | static_configs: 21 | - targets: ["prometheus:9090"] 22 | relabel_configs: 23 | - source_labels: [__address__] 24 | target_label: __param_target 25 | - source_labels: [__param_target] 26 | target_label: instance 27 | - target_label: __address__ 28 | replacement: blackbox-exporter:9115 29 | -------------------------------------------------------------------------------- /chap05/blackbox.yml: -------------------------------------------------------------------------------- 1 | --- 2 | modules: 3 | http_2xx: 4 | prober: http 5 | http: 6 | preferred_ip_protocol: ip4 7 | http_post_2xx: 8 | prober: http 9 | http: 10 | method: POST 11 | tcp_connect: 12 | prober: tcp 13 | pop3s_banner: 14 | prober: tcp 15 | tcp: 16 | query_response: 17 | - expect: '^+OK' 18 | tls: true 19 | tls_config: 20 | insecure_skip_verify: false 21 | ssh_banner: 22 | prober: tcp 23 | tcp: 24 | query_response: 25 | - expect: '^SSH-2.0-' 26 | irc_banner: 27 | prober: tcp 28 | tcp: 29 | query_response: 30 | - send: 'NICK prober' 31 | - send: 'USER prober prober prober :prober' 32 | - expect: 'PING :([^ ]+)' 33 | send: 'PONG ${1}' 34 | - expect: '^:[^ ]+ 001' 35 | icmp: 36 | prober: icmp 37 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/prometheus-operator-serviceMonitor.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | namespace: default 11 | spec: 12 | endpoints: 13 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 14 | honorLabels: true 15 | port: https 16 | scheme: https 17 | tlsConfig: 18 | insecureSkipVerify: true 19 | selector: 20 | matchLabels: 21 | app.kubernetes.io/component: controller 22 | app.kubernetes.io/name: prometheus-operator 23 | app.kubernetes.io/part-of: kube-prometheus 24 | app.kubernetes.io/version: 0.50.0 25 | -------------------------------------------------------------------------------- /chap09/victoriametrics/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | node-exporter: 14 | image: prom/node-exporter:v1.3.1 15 | ports: 16 | - '9100:9100' 17 | victoriametrics: 18 | image: victoriametrics/victoria-metrics:v1.59.0 19 | ports: 20 | - '8428:8428' 21 | volumes: 22 | - 'victoriametrics:/victoria-metrics-data' 23 | command: 24 | -storageDataPath=/victoria-metrics-data 25 | -retentionPeriod=30d 26 | grafana: 27 | image: grafana/grafana:8.3.6 28 | ports: 29 | - 3000:3000 30 | 31 | volumes: 32 | victoriametrics: 33 | driver: local 34 | -------------------------------------------------------------------------------- /chap12/grafana-loki/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | command: 11 | --web.enable-lifecycle 12 | --config.file=/etc/prometheus/prometheus.yml 13 | 14 | loki: 15 | image: grafana/loki:2.4.1 16 | ports: 17 | - '3100:3100' 18 | command: -config.file=/etc/loki/local-config.yaml 19 | networks: 20 | - loki 21 | 22 | promtail: 23 | image: grafana/promtail:2.4.1 24 | volumes: 25 | - /var/log:/var/log 26 | command: -config.file=/etc/promtail/config.yml 27 | networks: 28 | - loki 29 | 30 | grafana: 31 | image: grafana/grafana:8.3.6 32 | ports: 33 | - '3000:3000' 34 | networks: 35 | - loki 36 | 37 | networks: 38 | loki: {} 39 | -------------------------------------------------------------------------------- /chap12/victoriametrics/docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '3' 3 | services: 4 | prometheus: 5 | image: prom/prometheus:v2.33.3 6 | ports: 7 | - '9090:9090' 8 | volumes: 9 | - './prometheus.yml:/etc/prometheus/prometheus.yml' 10 | - './prometheus/data:/prometheus/data' 11 | command: 12 | --web.enable-lifecycle 13 | --web.enable-admin-api 14 | --config.file=/etc/prometheus/prometheus.yml 15 | node-exporter: 16 | image: prom/node-exporter:v1.3.1 17 | ports: 18 | - '9100:9100' 19 | victoriametrics: 20 | image: victoriametrics/victoria-metrics:v1.69.0 21 | ports: 22 | - '8428:8428' 23 | volumes: 24 | - 'victoriametrics:/victoria-metrics-data' 25 | command: 26 | -storageDataPath=/victoria-metrics-data 27 | -retentionPeriod=30d 28 | grafana: 29 | image: grafana/grafana:8.3.6 30 | ports: 31 | - 3000:3000 32 | volumes: 33 | - ./grafana/data:/var/lib/grafana 34 | 35 | volumes: 36 | victoriametrics: 37 | driver: local 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 実践Prometheus ハンズオン用リポジトリ 2 | 3 | ## このリポジトリは? 4 | 株式会社テッキーメディアより発売された、「実践Prometheus クラウドネイティブな監視システムの構築」のハンズオン用リポジトリです。 5 | 6 | [https://techiemedia.co.jp/](https://techiemedia.co.jp/) 7 | 8 | このリポジトリには、書籍に登場する各種構成を簡単に実現できるように、Docker-Composeによる構成ファイルなどを配置しています。 9 | ぜひ書籍とあわせてご利用ください。 10 | 11 | ## フィードバックについて 12 | 本リポジトリまたは書籍に関するフィードバックは、Issueを立てていただくか、著者のTwitterへ突撃ください。 13 | 14 | 👉 [@kameneko1004](https://twitter.com/kameneko1004) 15 | 16 | ## [おまけ]書籍販売書店 17 | 主に以下の書店等で販売しています。 18 | なお、ここに示した書店以外でも販売している可能性はあるため、詳細は各書店へお問い合わせください。 19 | 20 | - 紀伊國屋書店 新宿本店 21 | - 書泉ブックタワー 22 | - 八重洲ブックセンター本店 23 | - 文教堂溝ノ口本店 24 | - 三省堂書店名古屋本店 25 | - MARUZEN&ジュンク堂書店 札幌店 26 | - ジュンク堂書店 名古屋栄店 27 | - ジュンク堂書店 大阪本店 28 | - ジュンク堂書店 広島駅前店 29 | - ジュンク堂書店 新潟店 30 | - ジュンク堂書店 松坂屋高槻店 31 | - ジュンク堂書店 池袋本店 32 | - ジュンク堂書店 立川高島屋店 33 | - ジュンク堂書店 藤沢店 34 | - ジュンク堂書店 難波店 35 | - ジュンク堂書店 弘前中三店 36 | - ジュンク堂書店 岡島甲府店 37 | - ブックファースト中野店 38 | - ブックファースト新宿店 39 | - ブックファースト青葉台店 40 | - 丸善 ラゾーナ川崎店 41 | - 丸善 丸の内本店 42 | - 丸善 仙台アエル店 43 | - 丸善 博多店 44 | - 丸善 名古屋本店 45 | - 丸善 広島店 46 | - 丸善 松本店 47 | - 丸善 津田沼店 48 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-alertmanager.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: Alertmanager 3 | metadata: 4 | labels: 5 | alertmanager: main 6 | app.kubernetes.io/component: alert-router 7 | app.kubernetes.io/name: alertmanager 8 | app.kubernetes.io/part-of: kube-prometheus 9 | app.kubernetes.io/version: 0.22.2 10 | name: main 11 | namespace: default 12 | spec: 13 | image: prom/alertmanager:v0.23.0 14 | nodeSelector: 15 | kubernetes.io/os: linux 16 | podMetadata: 17 | labels: 18 | app.kubernetes.io/component: alert-router 19 | app.kubernetes.io/name: alertmanager 20 | app.kubernetes.io/part-of: kube-prometheus 21 | app.kubernetes.io/version: 0.22.2 22 | replicas: 3 23 | resources: 24 | limits: 25 | cpu: 100m 26 | memory: 100Mi 27 | requests: 28 | cpu: 4m 29 | memory: 100Mi 30 | securityContext: 31 | fsGroup: 2000 32 | runAsNonRoot: true 33 | runAsUser: 1000 34 | serviceAccountName: alertmanager-main 35 | version: 0.22.2 36 | -------------------------------------------------------------------------------- /chap10/exporter_basics/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "log" 6 | "net/http" 7 | 8 | "github.com/prometheus/client_golang/prometheus" 9 | "github.com/prometheus/client_golang/prometheus/promhttp" 10 | ) 11 | 12 | type myCollector struct{} 13 | 14 | var ( 15 | myCount = prometheus.NewCounter(prometheus.CounterOpts{ 16 | Name: "my_count", 17 | Help: "my counter help", 18 | }) 19 | countValue = float64(8888) 20 | ) 21 | 22 | func (c myCollector) Describe(ch chan<- *prometheus.Desc) { 23 | ch <- myCount.Desc() 24 | } 25 | 26 | func (c myCollector) Collect(ch chan<- prometheus.Metric) { 27 | 28 | ch <- prometheus.MustNewConstMetric( 29 | myCount.Desc(), 30 | prometheus.CounterValue, 31 | float64(countValue), 32 | ) 33 | } 34 | 35 | var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") 36 | 37 | func main() { 38 | flag.Parse() 39 | 40 | var c myCollector 41 | prometheus.MustRegister(c) 42 | 43 | http.Handle("/metrics", promhttp.Handler()) 44 | log.Fatal(http.ListenAndServe(*addr, nil)) 45 | } -------------------------------------------------------------------------------- /chap10/exporter_template/main.go: -------------------------------------------------------------------------------- 1 | // Copyright 2015 The Prometheus Authors 2 | // Licensed under the Apache License, Version 2.0 (the "License"); 3 | // you may not use this file except in compliance with the License. 4 | // You may obtain a copy of the License at 5 | // 6 | // http://www.apache.org/licenses/LICENSE-2.0 7 | // 8 | // Unless required by applicable law or agreed to in writing, software 9 | // distributed under the License is distributed on an "AS IS" BASIS, 10 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | // See the License for the specific language governing permissions and 12 | // limitations under the License. 13 | 14 | // A minimal example of how to include Prometheus instrumentation. 15 | 16 | package main 17 | 18 | import ( 19 | "flag" 20 | "log" 21 | "net/http" 22 | 23 | "github.com/prometheus/client_golang/prometheus/promhttp" 24 | ) 25 | 26 | var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") 27 | 28 | func main() { 29 | flag.Parse() 30 | http.Handle("/metrics", promhttp.Handler()) 31 | log.Fatal(http.ListenAndServe(*addr, nil)) 32 | } -------------------------------------------------------------------------------- /chap08/kubernetes_sd_configs/node-exporter.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: DaemonSet 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: node-exporter 6 | name: node-exporter 7 | namespace: default 8 | spec: 9 | selector: 10 | matchLabels: 11 | app.kubernetes.io/name: node-exporter 12 | template: 13 | metadata: 14 | labels: 15 | app.kubernetes.io/name: node-exporter 16 | spec: 17 | containers: 18 | - name: node-exporter 19 | image: 'prom/node-exporter:v1.3.1' 20 | ports: 21 | - name: http 22 | containerPort: 9100 23 | protocol: TCP 24 | hostNetwork: true 25 | hostPID: true 26 | tolerations: 27 | - key: node-role.kubernetes.io/master 28 | operator: Exists 29 | value: '' 30 | effect: NoSchedule 31 | --- 32 | apiVersion: v1 33 | kind: Service 34 | metadata: 35 | labels: 36 | app.kubernetes.io/name: node-exporter 37 | name: node-exporter 38 | namespace: default 39 | spec: 40 | ports: 41 | - name: http 42 | port: 9100 43 | targetPort: http 44 | selector: 45 | app.kubernetes.io/name: node-exporter 46 | -------------------------------------------------------------------------------- /chap10/exporter_count/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "flag" 5 | "log" 6 | "net/http" 7 | "fmt" 8 | 9 | "github.com/prometheus/client_golang/prometheus" 10 | "github.com/prometheus/client_golang/prometheus/promhttp" 11 | ) 12 | 13 | type myCollector struct{} 14 | 15 | var ( 16 | myCount = prometheus.NewCounter(prometheus.CounterOpts{ 17 | Name: "my_count", 18 | Help: "my counter help", 19 | }) 20 | countValue = float64(0) 21 | ) 22 | 23 | func (c myCollector) Describe(ch chan<- *prometheus.Desc) { 24 | ch <- myCount.Desc() 25 | } 26 | 27 | func (c myCollector) Collect(ch chan<- prometheus.Metric) { 28 | 29 | ch <- prometheus.MustNewConstMetric( 30 | myCount.Desc(), 31 | prometheus.CounterValue, 32 | float64(countValue), 33 | ) 34 | } 35 | 36 | func handler(w http.ResponseWriter, r *http.Request){ 37 | countValue++ 38 | fmt.Fprintf(w, "Hello :) %f", countValue) 39 | } 40 | 41 | var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") 42 | 43 | func main() { 44 | flag.Parse() 45 | 46 | var c myCollector 47 | prometheus.MustRegister(c) 48 | 49 | http.Handle("/metrics", promhttp.Handler()) 50 | http.HandleFunc("/", handler) 51 | log.Fatal(http.ListenAndServe(*addr, nil)) 52 | } -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-prometheus.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: Prometheus 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | prometheus: k8s 10 | name: k8s 11 | namespace: default 12 | spec: 13 | alerting: 14 | alertmanagers: 15 | - apiVersion: v2 16 | name: alertmanager-main 17 | namespace: default 18 | port: web 19 | enableFeatures: [] 20 | externalLabels: {} 21 | image: prom/prometheus:v2.33.3 22 | nodeSelector: 23 | kubernetes.io/os: linux 24 | podMetadata: 25 | labels: 26 | app.kubernetes.io/component: prometheus 27 | app.kubernetes.io/name: prometheus 28 | app.kubernetes.io/part-of: kube-prometheus 29 | app.kubernetes.io/version: 2.29.1 30 | podMonitorNamespaceSelector: {} 31 | podMonitorSelector: {} 32 | probeNamespaceSelector: {} 33 | probeSelector: {} 34 | replicas: 2 35 | resources: 36 | requests: 37 | memory: 400Mi 38 | ruleNamespaceSelector: {} 39 | ruleSelector: {} 40 | securityContext: 41 | fsGroup: 2000 42 | runAsNonRoot: true 43 | runAsUser: 1000 44 | serviceAccountName: prometheus-k8s 45 | serviceMonitorNamespaceSelector: {} 46 | serviceMonitorSelector: {} 47 | version: 2.29.1 48 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-secret.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Secret 3 | metadata: 4 | labels: 5 | alertmanager: main 6 | app.kubernetes.io/component: alert-router 7 | app.kubernetes.io/name: alertmanager 8 | app.kubernetes.io/part-of: kube-prometheus 9 | app.kubernetes.io/version: 0.22.2 10 | name: alertmanager-main 11 | namespace: default 12 | stringData: 13 | alertmanager.yaml: |- 14 | "global": 15 | "resolve_timeout": "5m" 16 | "inhibit_rules": 17 | - "equal": 18 | - "namespace" 19 | - "alertname" 20 | "source_match": 21 | "severity": "critical" 22 | "target_match_re": 23 | "severity": "warning|info" 24 | - "equal": 25 | - "namespace" 26 | - "alertname" 27 | "source_match": 28 | "severity": "warning" 29 | "target_match_re": 30 | "severity": "info" 31 | "receivers": 32 | - "name": "Default" 33 | - "name": "Watchdog" 34 | - "name": "Critical" 35 | "route": 36 | "group_by": 37 | - "namespace" 38 | "group_interval": "5m" 39 | "group_wait": "30s" 40 | "receiver": "Default" 41 | "repeat_interval": "12h" 42 | "routes": 43 | - "match": 44 | "alertname": "Watchdog" 45 | "receiver": "Watchdog" 46 | - "match": 47 | "severity": "critical" 48 | "receiver": "Critical" 49 | type: Opaque 50 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-roleBindingSpecificNamespaces.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | items: 3 | - apiVersion: rbac.authorization.k8s.io/v1 4 | kind: RoleBinding 5 | metadata: 6 | labels: 7 | app.kubernetes.io/component: prometheus 8 | app.kubernetes.io/name: prometheus 9 | app.kubernetes.io/part-of: kube-prometheus 10 | app.kubernetes.io/version: 2.29.1 11 | name: prometheus-k8s 12 | namespace: default 13 | roleRef: 14 | apiGroup: rbac.authorization.k8s.io 15 | kind: Role 16 | name: prometheus-k8s 17 | subjects: 18 | - kind: ServiceAccount 19 | name: prometheus-k8s 20 | namespace: default 21 | - apiVersion: rbac.authorization.k8s.io/v1 22 | kind: RoleBinding 23 | metadata: 24 | labels: 25 | app.kubernetes.io/component: prometheus 26 | app.kubernetes.io/name: prometheus 27 | app.kubernetes.io/part-of: kube-prometheus 28 | app.kubernetes.io/version: 2.29.1 29 | name: prometheus-k8s 30 | namespace: kube-system 31 | roleRef: 32 | apiGroup: rbac.authorization.k8s.io 33 | kind: Role 34 | name: prometheus-k8s 35 | subjects: 36 | - kind: ServiceAccount 37 | name: prometheus-k8s 38 | namespace: default 39 | - apiVersion: rbac.authorization.k8s.io/v1 40 | kind: RoleBinding 41 | metadata: 42 | labels: 43 | app.kubernetes.io/component: prometheus 44 | app.kubernetes.io/name: prometheus 45 | app.kubernetes.io/part-of: kube-prometheus 46 | app.kubernetes.io/version: 2.29.1 47 | name: prometheus-k8s 48 | namespace: default 49 | roleRef: 50 | apiGroup: rbac.authorization.k8s.io 51 | kind: Role 52 | name: prometheus-k8s 53 | subjects: 54 | - kind: ServiceAccount 55 | name: prometheus-k8s 56 | namespace: default 57 | kind: RoleBindingList 58 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-clusterRole.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | rules: 11 | - apiGroups: 12 | - monitoring.coreos.com 13 | resources: 14 | - alertmanagers 15 | - alertmanagers/finalizers 16 | - alertmanagerconfigs 17 | - prometheuses 18 | - prometheuses/finalizers 19 | - thanosrulers 20 | - thanosrulers/finalizers 21 | - servicemonitors 22 | - podmonitors 23 | - probes 24 | - prometheusrules 25 | verbs: 26 | - '*' 27 | - apiGroups: 28 | - apps 29 | resources: 30 | - statefulsets 31 | verbs: 32 | - '*' 33 | - apiGroups: 34 | - "" 35 | resources: 36 | - configmaps 37 | - secrets 38 | verbs: 39 | - '*' 40 | - apiGroups: 41 | - "" 42 | resources: 43 | - pods 44 | verbs: 45 | - list 46 | - delete 47 | - apiGroups: 48 | - "" 49 | resources: 50 | - services 51 | - services/finalizers 52 | - endpoints 53 | verbs: 54 | - get 55 | - create 56 | - update 57 | - delete 58 | - apiGroups: 59 | - "" 60 | resources: 61 | - nodes 62 | verbs: 63 | - list 64 | - watch 65 | - apiGroups: 66 | - "" 67 | resources: 68 | - namespaces 69 | verbs: 70 | - get 71 | - list 72 | - watch 73 | - apiGroups: 74 | - networking.k8s.io 75 | resources: 76 | - ingresses 77 | verbs: 78 | - get 79 | - list 80 | - watch 81 | - apiGroups: 82 | - authentication.k8s.io 83 | resources: 84 | - tokenreviews 85 | verbs: 86 | - create 87 | - apiGroups: 88 | - authorization.k8s.io 89 | resources: 90 | - subjectaccessreviews 91 | verbs: 92 | - create 93 | -------------------------------------------------------------------------------- /chap10/exporter_mysql/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "database/sql" 5 | "flag" 6 | "log" 7 | "net/http" 8 | 9 | _ "github.com/go-sql-driver/mysql" 10 | "github.com/prometheus/client_golang/prometheus" 11 | "github.com/prometheus/client_golang/prometheus/promhttp" 12 | ) 13 | 14 | type myCollector struct{} 15 | 16 | var ( 17 | samleGauge = prometheus.NewGauge(prometheus.GaugeOpts{ 18 | Name: "sample_metrics", 19 | Help: "sample metrics from mysql", 20 | }) 21 | metrics_value = float64(0) 22 | ) 23 | 24 | func (c myCollector) Describe(ch chan<- *prometheus.Desc) { 25 | ch <- samleGauge.Desc() 26 | } 27 | 28 | func (c myCollector) Collect(ch chan<- prometheus.Metric) { 29 | 30 | ch <- prometheus.MustNewConstMetric( 31 | samleGauge.Desc(), 32 | prometheus.GaugeValue, 33 | float64(metrics_value), 34 | ) 35 | } 36 | 37 | func get_metrics() { 38 | db, err := sql.Open("mysql", "root:prom@tcp(localhost:3306)/handson") 39 | if err != nil { 40 | log.Fatal(err) 41 | } 42 | defer db.Close() 43 | 44 | if err := db.Ping(); err != nil { 45 | panic(err) 46 | } 47 | 48 | err = db.QueryRow("select value from metrics where id=1 limit 1").Scan(&metrics_value) 49 | if err != nil { 50 | log.Fatal(err) 51 | } 52 | } 53 | 54 | func metricsHandler(w http.ResponseWriter, r *http.Request) { 55 | get_metrics() 56 | var c myCollector 57 | reg := prometheus.NewRegistry() 58 | reg.MustRegister(c) 59 | 60 | h := promhttp.HandlerFor(reg, promhttp.HandlerOpts{}) 61 | h.ServeHTTP(w, r) 62 | // var c myCollector 63 | // prometheus.MustRegister(c) 64 | 65 | // h := promhttp.Handler() 66 | // h.ServeHTTP(w, r) 67 | } 68 | 69 | var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") 70 | 71 | func main() { 72 | flag.Parse() 73 | 74 | http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) { 75 | metricsHandler(w, r) 76 | }) 77 | log.Fatal(http.ListenAndServe(*addr, nil)) 78 | } 79 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | name: prometheus-operator 10 | namespace: default 11 | spec: 12 | replicas: 1 13 | selector: 14 | matchLabels: 15 | app.kubernetes.io/component: controller 16 | app.kubernetes.io/name: prometheus-operator 17 | app.kubernetes.io/part-of: kube-prometheus 18 | template: 19 | metadata: 20 | annotations: 21 | kubectl.kubernetes.io/default-container: prometheus-operator 22 | labels: 23 | app.kubernetes.io/component: controller 24 | app.kubernetes.io/name: prometheus-operator 25 | app.kubernetes.io/part-of: kube-prometheus 26 | app.kubernetes.io/version: 0.50.0 27 | spec: 28 | containers: 29 | - args: 30 | - --kubelet-service=kube-system/kubelet 31 | - --prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.50.0 32 | image: quay.io/prometheus-operator/prometheus-operator:v0.50.0 33 | name: prometheus-operator 34 | ports: 35 | - containerPort: 8080 36 | name: http 37 | resources: 38 | limits: 39 | cpu: 200m 40 | memory: 200Mi 41 | requests: 42 | cpu: 100m 43 | memory: 100Mi 44 | securityContext: 45 | allowPrivilegeEscalation: false 46 | - args: 47 | - --logtostderr 48 | - --secure-listen-address=:8443 49 | - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305 50 | - --upstream=http://127.0.0.1:8080/ 51 | image: quay.io/brancz/kube-rbac-proxy:v0.11.0 52 | name: kube-rbac-proxy 53 | ports: 54 | - containerPort: 8443 55 | name: https 56 | resources: 57 | limits: 58 | cpu: 20m 59 | memory: 40Mi 60 | requests: 61 | cpu: 10m 62 | memory: 20Mi 63 | securityContext: 64 | runAsGroup: 65532 65 | runAsNonRoot: true 66 | runAsUser: 65532 67 | nodeSelector: 68 | kubernetes.io/os: linux 69 | securityContext: 70 | runAsNonRoot: true 71 | runAsUser: 65534 72 | serviceAccountName: prometheus-operator 73 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/prometheus/prometheus-roleSpecificNamespaces.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | items: 3 | - apiVersion: rbac.authorization.k8s.io/v1 4 | kind: Role 5 | metadata: 6 | labels: 7 | app.kubernetes.io/component: prometheus 8 | app.kubernetes.io/name: prometheus 9 | app.kubernetes.io/part-of: kube-prometheus 10 | app.kubernetes.io/version: 2.29.1 11 | name: prometheus-k8s 12 | namespace: default 13 | rules: 14 | - apiGroups: 15 | - "" 16 | resources: 17 | - services 18 | - endpoints 19 | - pods 20 | verbs: 21 | - get 22 | - list 23 | - watch 24 | - apiGroups: 25 | - extensions 26 | resources: 27 | - ingresses 28 | verbs: 29 | - get 30 | - list 31 | - watch 32 | - apiGroups: 33 | - networking.k8s.io 34 | resources: 35 | - ingresses 36 | verbs: 37 | - get 38 | - list 39 | - watch 40 | - apiVersion: rbac.authorization.k8s.io/v1 41 | kind: Role 42 | metadata: 43 | labels: 44 | app.kubernetes.io/component: prometheus 45 | app.kubernetes.io/name: prometheus 46 | app.kubernetes.io/part-of: kube-prometheus 47 | app.kubernetes.io/version: 2.29.1 48 | name: prometheus-k8s 49 | namespace: kube-system 50 | rules: 51 | - apiGroups: 52 | - "" 53 | resources: 54 | - services 55 | - endpoints 56 | - pods 57 | verbs: 58 | - get 59 | - list 60 | - watch 61 | - apiGroups: 62 | - extensions 63 | resources: 64 | - ingresses 65 | verbs: 66 | - get 67 | - list 68 | - watch 69 | - apiGroups: 70 | - networking.k8s.io 71 | resources: 72 | - ingresses 73 | verbs: 74 | - get 75 | - list 76 | - watch 77 | - apiVersion: rbac.authorization.k8s.io/v1 78 | kind: Role 79 | metadata: 80 | labels: 81 | app.kubernetes.io/component: prometheus 82 | app.kubernetes.io/name: prometheus 83 | app.kubernetes.io/part-of: kube-prometheus 84 | app.kubernetes.io/version: 2.29.1 85 | name: prometheus-k8s 86 | namespace: default 87 | rules: 88 | - apiGroups: 89 | - "" 90 | resources: 91 | - services 92 | - endpoints 93 | - pods 94 | verbs: 95 | - get 96 | - list 97 | - watch 98 | - apiGroups: 99 | - extensions 100 | resources: 101 | - ingresses 102 | verbs: 103 | - get 104 | - list 105 | - watch 106 | - apiGroups: 107 | - networking.k8s.io 108 | resources: 109 | - ingresses 110 | verbs: 111 | - get 112 | - list 113 | - watch 114 | kind: RoleList 115 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/rules/kube-prometheus-prometheusRule.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: PrometheusRule 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: exporter 6 | app.kubernetes.io/name: kube-prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | prometheus: k8s 9 | role: alert-rules 10 | name: kube-prometheus-rules 11 | namespace: default 12 | spec: 13 | groups: 14 | - name: general.rules 15 | rules: 16 | - alert: TargetDown 17 | annotations: 18 | description: '{{ printf "%.4g" $value }}% of the {{ $labels.job }}/{{ $labels.service }} targets in {{ $labels.namespace }} namespace are down.' 19 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/targetdown 20 | summary: One or more targets are unreachable. 21 | expr: 100 * (count(up == 0) BY (job, namespace, service) / count(up) BY (job, namespace, service)) > 10 22 | for: 10m 23 | labels: 24 | severity: warning 25 | - alert: Watchdog 26 | annotations: 27 | description: | 28 | This is an alert meant to ensure that the entire alerting pipeline is functional. 29 | This alert is always firing, therefore it should always be firing in Alertmanager 30 | and always fire against a receiver. There are integrations with various notification 31 | mechanisms that send a notification when this alert is not firing. For example the 32 | "DeadMansSnitch" integration in PagerDuty. 33 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/watchdog 34 | summary: An alert that should always be firing to certify that Alertmanager is working properly. 35 | expr: vector(1) 36 | labels: 37 | severity: none 38 | - name: node-network 39 | rules: 40 | - alert: NodeNetworkInterfaceFlapping 41 | annotations: 42 | description: Network interface "{{ $labels.device }}" changing its up status often on node-exporter {{ $labels.namespace }}/{{ $labels.pod }} 43 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/general/nodenetworkinterfaceflapping 44 | summary: Network interface is often changing its status 45 | expr: | 46 | changes(node_network_up{job="node-exporter",device!~"veth.+"}[2m]) > 2 47 | for: 2m 48 | labels: 49 | severity: warning 50 | - name: kube-prometheus-node-recording.rules 51 | rules: 52 | - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[3m])) BY (instance) 53 | record: instance:node_cpu:rate:sum 54 | - expr: sum(rate(node_network_receive_bytes_total[3m])) BY (instance) 55 | record: instance:node_network_receive_bytes:rate:sum 56 | - expr: sum(rate(node_network_transmit_bytes_total[3m])) BY (instance) 57 | record: instance:node_network_transmit_bytes:rate:sum 58 | - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[5m])) WITHOUT (cpu, mode) / ON(instance) GROUP_LEFT() count(sum(node_cpu_seconds_total) BY (instance, cpu)) BY (instance) 59 | record: instance:node_cpu:ratio 60 | - expr: sum(rate(node_cpu_seconds_total{mode!="idle",mode!="iowait",mode!="steal"}[5m])) 61 | record: cluster:node_cpu:sum_rate5m 62 | - expr: cluster:node_cpu_seconds_total:rate5m / count(sum(node_cpu_seconds_total) BY (instance, cpu)) 63 | record: cluster:node_cpu:ratio 64 | - name: kube-prometheus-general.rules 65 | rules: 66 | - expr: count without(instance, pod, node) (up == 1) 67 | record: count:up1 68 | - expr: count without(instance, pod, node) (up == 0) 69 | record: count:up0 70 | -------------------------------------------------------------------------------- /chap08/kubernetes_sd_configs/prometheus.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | name: prometheus 5 | rules: 6 | - apiGroups: [""] 7 | resources: 8 | - nodes 9 | - services 10 | - endpoints 11 | - pods 12 | - metrics 13 | - nodes/metrics 14 | verbs: ["get", "list", "watch"] 15 | - apiGroups: 16 | - extensions 17 | resources: 18 | - ingresses 19 | verbs: ["get", "list", "watch"] 20 | - nonResourceURLs: 21 | - /metrics 22 | verbs: ["get"] 23 | --- 24 | apiVersion: rbac.authorization.k8s.io/v1 25 | kind: ClusterRoleBinding 26 | metadata: 27 | name: prometheus 28 | roleRef: 29 | apiGroup: rbac.authorization.k8s.io 30 | kind: ClusterRole 31 | name: prometheus 32 | subjects: 33 | - kind: ServiceAccount 34 | name: prometheus 35 | namespace: default 36 | --- 37 | apiVersion: v1 38 | kind: ServiceAccount 39 | metadata: 40 | name: prometheus 41 | namespace: default 42 | --- 43 | apiVersion: v1 44 | kind: Service 45 | metadata: 46 | labels: 47 | app: prometheus 48 | name: prometheus 49 | spec: 50 | ports: 51 | - name: http 52 | port: 9090 53 | protocol: TCP 54 | targetPort: 9090 55 | selector: 56 | app: prometheus 57 | type: ClusterIP 58 | --- 59 | apiVersion: apps/v1 60 | kind: Deployment 61 | metadata: 62 | labels: 63 | app: prometheus 64 | name: prometheus 65 | namespace: default 66 | spec: 67 | replicas: 1 68 | selector: 69 | matchLabels: 70 | app: prometheus 71 | template: 72 | metadata: 73 | labels: 74 | app: prometheus 75 | spec: 76 | serviceAccountName: prometheus 77 | containers: 78 | - image: prom/prometheus:v2.33.3 79 | imagePullPolicy: IfNotPresent 80 | name: prometheus 81 | args: 82 | - --config.file=/prometheus/prometheus.yml 83 | - --log.level=debug 84 | - --web.enable-lifecycle 85 | ports: 86 | - name: http 87 | containerPort: 9090 88 | protocol: TCP 89 | volumeMounts: 90 | - name: prometheus 91 | mountPath: /prometheus/prometheus.yml 92 | subPath: prometheus.yml 93 | volumes: 94 | - name: prometheus 95 | configMap: 96 | name: prometheus 97 | --- 98 | apiVersion: v1 99 | data: 100 | prometheus.yml: | 101 | global: 102 | scrape_interval: 15s 103 | 104 | scrape_configs: 105 | - job_name: 'prometheus' 106 | kubernetes_sd_configs: 107 | - role: pod 108 | relabel_configs: 109 | - source_labels: [__meta_kubernetes_pod_name] 110 | regex: prometheus-.+ 111 | action: keep 112 | 113 | - job_name: 'apiserver' 114 | kubernetes_sd_configs: 115 | - role: service 116 | scheme: https 117 | tls_config: 118 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 119 | authorization: 120 | credentials_file: /var/run/secrets/kubernetes.io/serviceaccount/token 121 | relabel_configs: 122 | - source_labels: 123 | - __meta_kubernetes_namespace 124 | - __meta_kubernetes_service_name 125 | - __meta_kubernetes_service_port_name 126 | action: keep 127 | regex: default;kubernetes;https 128 | 129 | - job_name: 'node-exporter' 130 | scheme: http 131 | kubernetes_sd_configs: 132 | - role: node 133 | relabel_configs: 134 | - source_labels: [__address__] 135 | action: replace 136 | regex: (.+):.+ 137 | replacement: ${1}:9100 138 | target_label: __address__ 139 | kind: ConfigMap 140 | metadata: 141 | name: prometheus 142 | labels: 143 | app: prometheus 144 | -------------------------------------------------------------------------------- /chap08/kubernetes_monitoring/prometheus.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1beta1 2 | kind: ClusterRole 3 | metadata: 4 | name: prometheus 5 | rules: 6 | - apiGroups: [""] 7 | resources: 8 | - nodes 9 | - services 10 | - endpoints 11 | - pods 12 | - metrics 13 | - nodes/metrics 14 | verbs: ["get", "list", "watch"] 15 | - apiGroups: 16 | - extensions 17 | resources: 18 | - ingresses 19 | verbs: ["get", "list", "watch"] 20 | - nonResourceURLs: 21 | - /metrics 22 | verbs: ["get"] 23 | --- 24 | apiVersion: rbac.authorization.k8s.io/v1beta1 25 | kind: ClusterRoleBinding 26 | metadata: 27 | name: prometheus 28 | roleRef: 29 | apiGroup: rbac.authorization.k8s.io 30 | kind: ClusterRole 31 | name: prometheus 32 | subjects: 33 | - kind: ServiceAccount 34 | name: prometheus 35 | namespace: default 36 | --- 37 | apiVersion: v1 38 | kind: ServiceAccount 39 | metadata: 40 | name: prometheus 41 | namespace: default 42 | --- 43 | apiVersion: v1 44 | kind: Service 45 | metadata: 46 | labels: 47 | app: prometheus 48 | name: prometheus 49 | spec: 50 | ports: 51 | - name: http 52 | port: 9090 53 | protocol: TCP 54 | targetPort: 9090 55 | selector: 56 | app: prometheus 57 | type: ClusterIP 58 | --- 59 | apiVersion: apps/v1 60 | kind: Deployment 61 | metadata: 62 | labels: 63 | app: prometheus 64 | name: prometheus 65 | namespace: default 66 | spec: 67 | replicas: 1 68 | selector: 69 | matchLabels: 70 | app: prometheus 71 | template: 72 | metadata: 73 | labels: 74 | app: prometheus 75 | spec: 76 | serviceAccountName: prometheus 77 | containers: 78 | - image: prom/prometheus:v2.23.3 79 | imagePullPolicy: IfNotPresent 80 | name: prometheus 81 | args: 82 | - --config.file=/prometheus/prometheus.yml 83 | - --log.level=debug 84 | - --web.enable-lifecycle 85 | ports: 86 | - name: http 87 | containerPort: 9090 88 | protocol: TCP 89 | volumeMounts: 90 | - name: prometheus 91 | mountPath: /prometheus/prometheus.yml 92 | subPath: prometheus.yml 93 | volumes: 94 | - name: prometheus 95 | configMap: 96 | name: prometheus 97 | --- 98 | apiVersion: v1 99 | data: 100 | prometheus.yml: | 101 | global: 102 | scrape_interval: 15s 103 | 104 | rule_files: 105 | - "alerts.yaml" 106 | 107 | scrape_configs: 108 | - job_name: 'prometheus' 109 | kubernetes_sd_configs: 110 | - role: pod 111 | relabel_configs: 112 | - source_labels: [__meta_kubernetes_pod_name] 113 | regex: prometheus-.+ 114 | action: keep 115 | - job_name: 'kube-state-metrics' 116 | kubernetes_sd_configs: 117 | - role: pod 118 | relabel_configs: 119 | - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_name] 120 | regex: kube-state-metrics 121 | action: keep 122 | - source_labels: [__meta_kubernetes_pod_container_port_name] 123 | regex: http 124 | action: keep 125 | - job_name: 'apiserver' 126 | kubernetes_sd_configs: 127 | - role: service 128 | scheme: https 129 | tls_config: 130 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 131 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 132 | relabel_configs: 133 | - source_labels: 134 | - __meta_kubernetes_namespace 135 | - __meta_kubernetes_service_name 136 | - __meta_kubernetes_service_port_name 137 | action: keep 138 | regex: default;kubernetes;https 139 | - job_name: 'kubelet' 140 | scheme: https 141 | tls_config: 142 | ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 143 | insecure_skip_verify: true 144 | bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token 145 | kubernetes_sd_configs: 146 | - role: node 147 | kind: ConfigMap 148 | metadata: 149 | name: prometheus 150 | labels: 151 | app: prometheus 152 | -------------------------------------------------------------------------------- /chap08/kubernetes_monitoring/kube-state-metrics.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: rbac.authorization.k8s.io/v1 2 | kind: ClusterRole 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-state-metrics 6 | name: kube-state-metrics 7 | rules: 8 | - apiGroups: 9 | - "" 10 | resources: 11 | - configmaps 12 | - secrets 13 | - nodes 14 | - pods 15 | - services 16 | - resourcequotas 17 | - replicationcontrollers 18 | - limitranges 19 | - persistentvolumeclaims 20 | - persistentvolumes 21 | - namespaces 22 | - endpoints 23 | verbs: 24 | - list 25 | - watch 26 | - apiGroups: 27 | - extensions 28 | resources: 29 | - daemonsets 30 | - deployments 31 | - replicasets 32 | - ingresses 33 | verbs: 34 | - list 35 | - watch 36 | - apiGroups: 37 | - apps 38 | resources: 39 | - statefulsets 40 | - daemonsets 41 | - deployments 42 | - replicasets 43 | verbs: 44 | - list 45 | - watch 46 | - apiGroups: 47 | - batch 48 | resources: 49 | - cronjobs 50 | - jobs 51 | verbs: 52 | - list 53 | - watch 54 | - apiGroups: 55 | - autoscaling 56 | resources: 57 | - horizontalpodautoscalers 58 | verbs: 59 | - list 60 | - watch 61 | - apiGroups: 62 | - authentication.k8s.io 63 | resources: 64 | - tokenreviews 65 | verbs: 66 | - create 67 | - apiGroups: 68 | - authorization.k8s.io 69 | resources: 70 | - subjectaccessreviews 71 | verbs: 72 | - create 73 | - apiGroups: 74 | - policy 75 | resources: 76 | - poddisruptionbudgets 77 | verbs: 78 | - list 79 | - watch 80 | - apiGroups: 81 | - certificates.k8s.io 82 | resources: 83 | - certificatesigningrequests 84 | verbs: 85 | - list 86 | - watch 87 | - apiGroups: 88 | - storage.k8s.io 89 | resources: 90 | - storageclasses 91 | - volumeattachments 92 | verbs: 93 | - list 94 | - watch 95 | - apiGroups: 96 | - admissionregistration.k8s.io 97 | resources: 98 | - mutatingwebhookconfigurations 99 | - validatingwebhookconfigurations 100 | verbs: 101 | - list 102 | - watch 103 | - apiGroups: 104 | - networking.k8s.io 105 | resources: 106 | - networkpolicies 107 | verbs: 108 | - list 109 | - watch 110 | --- 111 | apiVersion: rbac.authorization.k8s.io/v1 112 | kind: ClusterRoleBinding 113 | metadata: 114 | labels: 115 | app.kubernetes.io/name: kube-state-metrics 116 | name: kube-state-metrics 117 | roleRef: 118 | apiGroup: rbac.authorization.k8s.io 119 | kind: ClusterRole 120 | name: kube-state-metrics 121 | subjects: 122 | - kind: ServiceAccount 123 | name: kube-state-metrics 124 | namespace: default 125 | --- 126 | apiVersion: v1 127 | kind: ServiceAccount 128 | metadata: 129 | labels: 130 | app.kubernetes.io/name: kube-state-metrics 131 | name: kube-state-metrics 132 | namespace: default 133 | --- 134 | apiVersion: apps/v1 135 | kind: Deployment 136 | metadata: 137 | labels: 138 | app.kubernetes.io/name: kube-state-metrics 139 | name: kube-state-metrics 140 | namespace: default 141 | spec: 142 | replicas: 1 143 | selector: 144 | matchLabels: 145 | app.kubernetes.io/name: kube-state-metrics 146 | template: 147 | metadata: 148 | labels: 149 | app.kubernetes.io/name: kube-state-metrics 150 | spec: 151 | containers: 152 | - args: 153 | - --host=0.0.0.0 154 | - --port=8081 155 | - --telemetry-host=0.0.0.0 156 | - --telemetry-port=8082 157 | image: quay.io/coreos/kube-state-metrics:v2.3.0 158 | name: kube-state-metrics 159 | ports: 160 | - name: http 161 | containerPort: 8081 162 | - name: telemetry 163 | containerPort: 8082 164 | serviceAccountName: kube-state-metrics 165 | --- 166 | apiVersion: v1 167 | kind: Service 168 | metadata: 169 | labels: 170 | app.kubernetes.io/name: kube-state-metrics 171 | name: kube-state-metrics 172 | namespace: default 173 | spec: 174 | ports: 175 | - name: http 176 | port: 8081 177 | targetPort: http 178 | - name: telemetry 179 | port: 8082 180 | targetPort: telemetry 181 | selector: 182 | app.kubernetes.io/name: kube-state-metrics -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/setup/prometheus-operator-0prometheusruleCustomResourceDefinition.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apiextensions.k8s.io/v1 2 | kind: CustomResourceDefinition 3 | metadata: 4 | annotations: 5 | controller-gen.kubebuilder.io/version: v0.4.1 6 | creationTimestamp: null 7 | name: prometheusrules.monitoring.coreos.com 8 | spec: 9 | group: monitoring.coreos.com 10 | names: 11 | categories: 12 | - prometheus-operator 13 | kind: PrometheusRule 14 | listKind: PrometheusRuleList 15 | plural: prometheusrules 16 | singular: prometheusrule 17 | scope: Namespaced 18 | versions: 19 | - name: v1 20 | schema: 21 | openAPIV3Schema: 22 | description: PrometheusRule defines recording and alerting rules for a Prometheus instance 23 | properties: 24 | apiVersion: 25 | description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' 26 | type: string 27 | kind: 28 | description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' 29 | type: string 30 | metadata: 31 | type: object 32 | spec: 33 | description: Specification of desired alerting rule definitions for Prometheus. 34 | properties: 35 | groups: 36 | description: Content of Prometheus rule file 37 | items: 38 | description: 'RuleGroup is a list of sequentially evaluated recording and alerting rules. Note: PartialResponseStrategy is only used by ThanosRuler and will be ignored by Prometheus instances. Valid values for this field are ''warn'' or ''abort''. More info: https://github.com/thanos-io/thanos/blob/master/docs/components/rule.md#partial-response' 39 | properties: 40 | interval: 41 | type: string 42 | name: 43 | type: string 44 | partial_response_strategy: 45 | type: string 46 | rules: 47 | items: 48 | description: 'Rule describes an alerting or recording rule See Prometheus documentation: [alerting](https://www.prometheus.io/docs/prometheus/latest/configuration/alerting_rules/) or [recording](https://www.prometheus.io/docs/prometheus/latest/configuration/recording_rules/#recording-rules) rule' 49 | properties: 50 | alert: 51 | type: string 52 | annotations: 53 | additionalProperties: 54 | type: string 55 | type: object 56 | expr: 57 | anyOf: 58 | - type: integer 59 | - type: string 60 | x-kubernetes-int-or-string: true 61 | for: 62 | type: string 63 | labels: 64 | additionalProperties: 65 | type: string 66 | type: object 67 | record: 68 | type: string 69 | required: 70 | - expr 71 | type: object 72 | type: array 73 | required: 74 | - name 75 | - rules 76 | type: object 77 | type: array 78 | type: object 79 | required: 80 | - spec 81 | type: object 82 | served: true 83 | storage: true 84 | status: 85 | acceptedNames: 86 | kind: "" 87 | plural: "" 88 | conditions: [] 89 | storedVersions: [] 90 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/rules/prometheus-operator-prometheusRule.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: PrometheusRule 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: controller 6 | app.kubernetes.io/name: prometheus-operator 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.50.0 9 | prometheus: k8s 10 | role: alert-rules 11 | name: prometheus-operator-rules 12 | namespace: default 13 | spec: 14 | groups: 15 | - name: prometheus-operator 16 | rules: 17 | - alert: PrometheusOperatorListErrors 18 | annotations: 19 | description: Errors while performing List operations in controller {{$labels.controller}} in {{$labels.namespace}} namespace. 20 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatorlisterrors 21 | summary: Errors while performing list operations in controller. 22 | expr: | 23 | (sum by (controller,namespace) (rate(prometheus_operator_list_operations_failed_total{job="prometheus-operator",namespace="default"}[10m])) / sum by (controller,namespace) (rate(prometheus_operator_list_operations_total{job="prometheus-operator",namespace="default"}[10m]))) > 0.4 24 | for: 15m 25 | labels: 26 | severity: warning 27 | - alert: PrometheusOperatorWatchErrors 28 | annotations: 29 | description: Errors while performing watch operations in controller {{$labels.controller}} in {{$labels.namespace}} namespace. 30 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatorwatcherrors 31 | summary: Errors while performing watch operations in controller. 32 | expr: | 33 | (sum by (controller,namespace) (rate(prometheus_operator_watch_operations_failed_total{job="prometheus-operator",namespace="default"}[10m])) / sum by (controller,namespace) (rate(prometheus_operator_watch_operations_total{job="prometheus-operator",namespace="default"}[10m]))) > 0.4 34 | for: 15m 35 | labels: 36 | severity: warning 37 | - alert: PrometheusOperatorSyncFailed 38 | annotations: 39 | description: Controller {{ $labels.controller }} in {{ $labels.namespace }} namespace fails to reconcile {{ $value }} objects. 40 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatorsyncfailed 41 | summary: Last controller reconciliation failed 42 | expr: | 43 | min_over_time(prometheus_operator_syncs{status="failed",job="prometheus-operator",namespace="default"}[5m]) > 0 44 | for: 10m 45 | labels: 46 | severity: warning 47 | - alert: PrometheusOperatorReconcileErrors 48 | annotations: 49 | description: '{{ $value | humanizePercentage }} of reconciling operations failed for {{ $labels.controller }} controller in {{ $labels.namespace }} namespace.' 50 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatorreconcileerrors 51 | summary: Errors while reconciling controller. 52 | expr: | 53 | (sum by (controller,namespace) (rate(prometheus_operator_reconcile_errors_total{job="prometheus-operator",namespace="default"}[5m]))) / (sum by (controller,namespace) (rate(prometheus_operator_reconcile_operations_total{job="prometheus-operator",namespace="default"}[5m]))) > 0.1 54 | for: 10m 55 | labels: 56 | severity: warning 57 | - alert: PrometheusOperatorNodeLookupErrors 58 | annotations: 59 | description: Errors while reconciling Prometheus in {{ $labels.namespace }} Namespace. 60 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatornodelookuperrors 61 | summary: Errors while reconciling Prometheus. 62 | expr: | 63 | rate(prometheus_operator_node_address_lookup_errors_total{job="prometheus-operator",namespace="default"}[5m]) > 0.1 64 | for: 10m 65 | labels: 66 | severity: warning 67 | - alert: PrometheusOperatorNotReady 68 | annotations: 69 | description: Prometheus operator in {{ $labels.namespace }} namespace isn't ready to reconcile {{ $labels.controller }} resources. 70 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatornotready 71 | summary: Prometheus operator not ready 72 | expr: | 73 | min by(namespace, controller) (max_over_time(prometheus_operator_ready{job="prometheus-operator",namespace="default"}[5m]) == 0) 74 | for: 5m 75 | labels: 76 | severity: warning 77 | - alert: PrometheusOperatorRejectedResources 78 | annotations: 79 | description: Prometheus operator in {{ $labels.namespace }} namespace rejected {{ printf "%0.0f" $value }} {{ $labels.controller }}/{{ $labels.resource }} resources. 80 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus-operator/prometheusoperatorrejectedresources 81 | summary: Resources rejected by Prometheus operator 82 | expr: | 83 | min_over_time(prometheus_operator_managed_resources{state="rejected",job="prometheus-operator",namespace="default"}[5m]) > 0 84 | for: 5m 85 | labels: 86 | severity: warning 87 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/kubernetes-serviceMonitorKubeControllerManager.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kube-controller-manager 6 | name: kube-controller-manager 7 | namespace: default 8 | spec: 9 | endpoints: 10 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 11 | interval: 30s 12 | metricRelabelings: 13 | - action: drop 14 | regex: kubelet_(pod_worker_latency_microseconds|pod_start_latency_microseconds|cgroup_manager_latency_microseconds|pod_worker_start_latency_microseconds|pleg_relist_latency_microseconds|pleg_relist_interval_microseconds|runtime_operations|runtime_operations_latency_microseconds|runtime_operations_errors|eviction_stats_age_microseconds|device_plugin_registration_count|device_plugin_alloc_latency_microseconds|network_plugin_operations_latency_microseconds) 15 | sourceLabels: 16 | - __name__ 17 | - action: drop 18 | regex: scheduler_(e2e_scheduling_latency_microseconds|scheduling_algorithm_predicate_evaluation|scheduling_algorithm_priority_evaluation|scheduling_algorithm_preemption_evaluation|scheduling_algorithm_latency_microseconds|binding_latency_microseconds|scheduling_latency_seconds) 19 | sourceLabels: 20 | - __name__ 21 | - action: drop 22 | regex: apiserver_(request_count|request_latencies|request_latencies_summary|dropped_requests|storage_data_key_generation_latencies_microseconds|storage_transformation_failures_total|storage_transformation_latencies_microseconds|proxy_tunnel_sync_latency_secs) 23 | sourceLabels: 24 | - __name__ 25 | - action: drop 26 | regex: kubelet_docker_(operations|operations_latency_microseconds|operations_errors|operations_timeout) 27 | sourceLabels: 28 | - __name__ 29 | - action: drop 30 | regex: reflector_(items_per_list|items_per_watch|list_duration_seconds|lists_total|short_watches_total|watch_duration_seconds|watches_total) 31 | sourceLabels: 32 | - __name__ 33 | - action: drop 34 | regex: etcd_(helper_cache_hit_count|helper_cache_miss_count|helper_cache_entry_count|object_counts|request_cache_get_latencies_summary|request_cache_add_latencies_summary|request_latencies_summary) 35 | sourceLabels: 36 | - __name__ 37 | - action: drop 38 | regex: transformation_(transformation_latencies_microseconds|failures_total) 39 | sourceLabels: 40 | - __name__ 41 | - action: drop 42 | regex: (admission_quota_controller_adds|admission_quota_controller_depth|admission_quota_controller_longest_running_processor_microseconds|admission_quota_controller_queue_latency|admission_quota_controller_unfinished_work_seconds|admission_quota_controller_work_duration|APIServiceOpenAPIAggregationControllerQueue1_adds|APIServiceOpenAPIAggregationControllerQueue1_depth|APIServiceOpenAPIAggregationControllerQueue1_longest_running_processor_microseconds|APIServiceOpenAPIAggregationControllerQueue1_queue_latency|APIServiceOpenAPIAggregationControllerQueue1_retries|APIServiceOpenAPIAggregationControllerQueue1_unfinished_work_seconds|APIServiceOpenAPIAggregationControllerQueue1_work_duration|APIServiceRegistrationController_adds|APIServiceRegistrationController_depth|APIServiceRegistrationController_longest_running_processor_microseconds|APIServiceRegistrationController_queue_latency|APIServiceRegistrationController_retries|APIServiceRegistrationController_unfinished_work_seconds|APIServiceRegistrationController_work_duration|autoregister_adds|autoregister_depth|autoregister_longest_running_processor_microseconds|autoregister_queue_latency|autoregister_retries|autoregister_unfinished_work_seconds|autoregister_work_duration|AvailableConditionController_adds|AvailableConditionController_depth|AvailableConditionController_longest_running_processor_microseconds|AvailableConditionController_queue_latency|AvailableConditionController_retries|AvailableConditionController_unfinished_work_seconds|AvailableConditionController_work_duration|crd_autoregistration_controller_adds|crd_autoregistration_controller_depth|crd_autoregistration_controller_longest_running_processor_microseconds|crd_autoregistration_controller_queue_latency|crd_autoregistration_controller_retries|crd_autoregistration_controller_unfinished_work_seconds|crd_autoregistration_controller_work_duration|crdEstablishing_adds|crdEstablishing_depth|crdEstablishing_longest_running_processor_microseconds|crdEstablishing_queue_latency|crdEstablishing_retries|crdEstablishing_unfinished_work_seconds|crdEstablishing_work_duration|crd_finalizer_adds|crd_finalizer_depth|crd_finalizer_longest_running_processor_microseconds|crd_finalizer_queue_latency|crd_finalizer_retries|crd_finalizer_unfinished_work_seconds|crd_finalizer_work_duration|crd_naming_condition_controller_adds|crd_naming_condition_controller_depth|crd_naming_condition_controller_longest_running_processor_microseconds|crd_naming_condition_controller_queue_latency|crd_naming_condition_controller_retries|crd_naming_condition_controller_unfinished_work_seconds|crd_naming_condition_controller_work_duration|crd_openapi_controller_adds|crd_openapi_controller_depth|crd_openapi_controller_longest_running_processor_microseconds|crd_openapi_controller_queue_latency|crd_openapi_controller_retries|crd_openapi_controller_unfinished_work_seconds|crd_openapi_controller_work_duration|DiscoveryController_adds|DiscoveryController_depth|DiscoveryController_longest_running_processor_microseconds|DiscoveryController_queue_latency|DiscoveryController_retries|DiscoveryController_unfinished_work_seconds|DiscoveryController_work_duration|kubeproxy_sync_proxy_rules_latency_microseconds|non_structural_schema_condition_controller_adds|non_structural_schema_condition_controller_depth|non_structural_schema_condition_controller_longest_running_processor_microseconds|non_structural_schema_condition_controller_queue_latency|non_structural_schema_condition_controller_retries|non_structural_schema_condition_controller_unfinished_work_seconds|non_structural_schema_condition_controller_work_duration|rest_client_request_latency_seconds|storage_operation_errors_total|storage_operation_status_count) 43 | sourceLabels: 44 | - __name__ 45 | - action: drop 46 | regex: etcd_(debugging|disk|request|server).* 47 | sourceLabels: 48 | - __name__ 49 | port: https-metrics 50 | scheme: https 51 | tlsConfig: 52 | insecureSkipVerify: true 53 | jobLabel: app.kubernetes.io/name 54 | namespaceSelector: 55 | matchNames: 56 | - kube-system 57 | selector: 58 | matchLabels: 59 | app.kubernetes.io/name: kube-controller-manager 60 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/kubernetes-serviceMonitorApiserver.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: apiserver 6 | name: kube-apiserver 7 | namespace: default 8 | spec: 9 | endpoints: 10 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 11 | interval: 30s 12 | metricRelabelings: 13 | - action: drop 14 | regex: kubelet_(pod_worker_latency_microseconds|pod_start_latency_microseconds|cgroup_manager_latency_microseconds|pod_worker_start_latency_microseconds|pleg_relist_latency_microseconds|pleg_relist_interval_microseconds|runtime_operations|runtime_operations_latency_microseconds|runtime_operations_errors|eviction_stats_age_microseconds|device_plugin_registration_count|device_plugin_alloc_latency_microseconds|network_plugin_operations_latency_microseconds) 15 | sourceLabels: 16 | - __name__ 17 | - action: drop 18 | regex: scheduler_(e2e_scheduling_latency_microseconds|scheduling_algorithm_predicate_evaluation|scheduling_algorithm_priority_evaluation|scheduling_algorithm_preemption_evaluation|scheduling_algorithm_latency_microseconds|binding_latency_microseconds|scheduling_latency_seconds) 19 | sourceLabels: 20 | - __name__ 21 | - action: drop 22 | regex: apiserver_(request_count|request_latencies|request_latencies_summary|dropped_requests|storage_data_key_generation_latencies_microseconds|storage_transformation_failures_total|storage_transformation_latencies_microseconds|proxy_tunnel_sync_latency_secs) 23 | sourceLabels: 24 | - __name__ 25 | - action: drop 26 | regex: kubelet_docker_(operations|operations_latency_microseconds|operations_errors|operations_timeout) 27 | sourceLabels: 28 | - __name__ 29 | - action: drop 30 | regex: reflector_(items_per_list|items_per_watch|list_duration_seconds|lists_total|short_watches_total|watch_duration_seconds|watches_total) 31 | sourceLabels: 32 | - __name__ 33 | - action: drop 34 | regex: etcd_(helper_cache_hit_count|helper_cache_miss_count|helper_cache_entry_count|object_counts|request_cache_get_latencies_summary|request_cache_add_latencies_summary|request_latencies_summary) 35 | sourceLabels: 36 | - __name__ 37 | - action: drop 38 | regex: transformation_(transformation_latencies_microseconds|failures_total) 39 | sourceLabels: 40 | - __name__ 41 | - action: drop 42 | regex: (admission_quota_controller_adds|admission_quota_controller_depth|admission_quota_controller_longest_running_processor_microseconds|admission_quota_controller_queue_latency|admission_quota_controller_unfinished_work_seconds|admission_quota_controller_work_duration|APIServiceOpenAPIAggregationControllerQueue1_adds|APIServiceOpenAPIAggregationControllerQueue1_depth|APIServiceOpenAPIAggregationControllerQueue1_longest_running_processor_microseconds|APIServiceOpenAPIAggregationControllerQueue1_queue_latency|APIServiceOpenAPIAggregationControllerQueue1_retries|APIServiceOpenAPIAggregationControllerQueue1_unfinished_work_seconds|APIServiceOpenAPIAggregationControllerQueue1_work_duration|APIServiceRegistrationController_adds|APIServiceRegistrationController_depth|APIServiceRegistrationController_longest_running_processor_microseconds|APIServiceRegistrationController_queue_latency|APIServiceRegistrationController_retries|APIServiceRegistrationController_unfinished_work_seconds|APIServiceRegistrationController_work_duration|autoregister_adds|autoregister_depth|autoregister_longest_running_processor_microseconds|autoregister_queue_latency|autoregister_retries|autoregister_unfinished_work_seconds|autoregister_work_duration|AvailableConditionController_adds|AvailableConditionController_depth|AvailableConditionController_longest_running_processor_microseconds|AvailableConditionController_queue_latency|AvailableConditionController_retries|AvailableConditionController_unfinished_work_seconds|AvailableConditionController_work_duration|crd_autoregistration_controller_adds|crd_autoregistration_controller_depth|crd_autoregistration_controller_longest_running_processor_microseconds|crd_autoregistration_controller_queue_latency|crd_autoregistration_controller_retries|crd_autoregistration_controller_unfinished_work_seconds|crd_autoregistration_controller_work_duration|crdEstablishing_adds|crdEstablishing_depth|crdEstablishing_longest_running_processor_microseconds|crdEstablishing_queue_latency|crdEstablishing_retries|crdEstablishing_unfinished_work_seconds|crdEstablishing_work_duration|crd_finalizer_adds|crd_finalizer_depth|crd_finalizer_longest_running_processor_microseconds|crd_finalizer_queue_latency|crd_finalizer_retries|crd_finalizer_unfinished_work_seconds|crd_finalizer_work_duration|crd_naming_condition_controller_adds|crd_naming_condition_controller_depth|crd_naming_condition_controller_longest_running_processor_microseconds|crd_naming_condition_controller_queue_latency|crd_naming_condition_controller_retries|crd_naming_condition_controller_unfinished_work_seconds|crd_naming_condition_controller_work_duration|crd_openapi_controller_adds|crd_openapi_controller_depth|crd_openapi_controller_longest_running_processor_microseconds|crd_openapi_controller_queue_latency|crd_openapi_controller_retries|crd_openapi_controller_unfinished_work_seconds|crd_openapi_controller_work_duration|DiscoveryController_adds|DiscoveryController_depth|DiscoveryController_longest_running_processor_microseconds|DiscoveryController_queue_latency|DiscoveryController_retries|DiscoveryController_unfinished_work_seconds|DiscoveryController_work_duration|kubeproxy_sync_proxy_rules_latency_microseconds|non_structural_schema_condition_controller_adds|non_structural_schema_condition_controller_depth|non_structural_schema_condition_controller_longest_running_processor_microseconds|non_structural_schema_condition_controller_queue_latency|non_structural_schema_condition_controller_retries|non_structural_schema_condition_controller_unfinished_work_seconds|non_structural_schema_condition_controller_work_duration|rest_client_request_latency_seconds|storage_operation_errors_total|storage_operation_status_count) 43 | sourceLabels: 44 | - __name__ 45 | - action: drop 46 | regex: etcd_(debugging|disk|server).* 47 | sourceLabels: 48 | - __name__ 49 | - action: drop 50 | regex: apiserver_admission_controller_admission_latencies_seconds_.* 51 | sourceLabels: 52 | - __name__ 53 | - action: drop 54 | regex: apiserver_admission_step_admission_latencies_seconds_.* 55 | sourceLabels: 56 | - __name__ 57 | - action: drop 58 | regex: apiserver_request_duration_seconds_bucket;(0.15|0.25|0.3|0.35|0.4|0.45|0.6|0.7|0.8|0.9|1.25|1.5|1.75|2.5|3|3.5|4.5|6|7|8|9|15|25|30|50) 59 | sourceLabels: 60 | - __name__ 61 | - le 62 | port: https 63 | scheme: https 64 | tlsConfig: 65 | caFile: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 66 | serverName: kubernetes 67 | jobLabel: component 68 | namespaceSelector: 69 | matchNames: 70 | - default 71 | selector: 72 | matchLabels: 73 | component: apiserver 74 | provider: kubernetes 75 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/alertmanager/alertmanager-prometheusRule.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: PrometheusRule 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: alert-router 6 | app.kubernetes.io/name: alertmanager 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 0.22.2 9 | prometheus: k8s 10 | role: alert-rules 11 | name: alertmanager-main-rules 12 | namespace: default 13 | spec: 14 | groups: 15 | - name: alertmanager.rules 16 | rules: 17 | - alert: AlertmanagerFailedReload 18 | annotations: 19 | description: Configuration has failed to load for {{ $labels.namespace }}/{{ $labels.pod}}. 20 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerfailedreload 21 | summary: Reloading an Alertmanager configuration has failed. 22 | expr: | 23 | # Without max_over_time, failed scrapes could create false negatives, see 24 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 25 | max_over_time(alertmanager_config_last_reload_successful{job="alertmanager-main",namespace="default"}[5m]) == 0 26 | for: 10m 27 | labels: 28 | severity: critical 29 | - alert: AlertmanagerMembersInconsistent 30 | annotations: 31 | description: Alertmanager {{ $labels.namespace }}/{{ $labels.pod}} has only found {{ $value }} members of the {{$labels.job}} cluster. 32 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagermembersinconsistent 33 | summary: A member of an Alertmanager cluster has not found all other cluster members. 34 | expr: | 35 | # Without max_over_time, failed scrapes could create false negatives, see 36 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 37 | max_over_time(alertmanager_cluster_members{job="alertmanager-main",namespace="default"}[5m]) 38 | < on (namespace,service) group_left 39 | count by (namespace,service) (max_over_time(alertmanager_cluster_members{job="alertmanager-main",namespace="default"}[5m])) 40 | for: 15m 41 | labels: 42 | severity: critical 43 | - alert: AlertmanagerFailedToSendAlerts 44 | annotations: 45 | description: Alertmanager {{ $labels.namespace }}/{{ $labels.pod}} failed to send {{ $value | humanizePercentage }} of notifications to {{ $labels.integration }}. 46 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerfailedtosendalerts 47 | summary: An Alertmanager instance failed to send notifications. 48 | expr: | 49 | ( 50 | rate(alertmanager_notifications_failed_total{job="alertmanager-main",namespace="default"}[5m]) 51 | / 52 | rate(alertmanager_notifications_total{job="alertmanager-main",namespace="default"}[5m]) 53 | ) 54 | > 0.01 55 | for: 5m 56 | labels: 57 | severity: warning 58 | - alert: AlertmanagerClusterFailedToSendAlerts 59 | annotations: 60 | description: The minimum notification failure rate to {{ $labels.integration }} sent from any instance in the {{$labels.job}} cluster is {{ $value | humanizePercentage }}. 61 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts 62 | summary: All Alertmanager instances in a cluster failed to send notifications to a critical integration. 63 | expr: | 64 | min by (namespace,service, integration) ( 65 | rate(alertmanager_notifications_failed_total{job="alertmanager-main",namespace="default", integration=~`.*`}[5m]) 66 | / 67 | rate(alertmanager_notifications_total{job="alertmanager-main",namespace="default", integration=~`.*`}[5m]) 68 | ) 69 | > 0.01 70 | for: 5m 71 | labels: 72 | severity: critical 73 | - alert: AlertmanagerClusterFailedToSendAlerts 74 | annotations: 75 | description: The minimum notification failure rate to {{ $labels.integration }} sent from any instance in the {{$labels.job}} cluster is {{ $value | humanizePercentage }}. 76 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterfailedtosendalerts 77 | summary: All Alertmanager instances in a cluster failed to send notifications to a non-critical integration. 78 | expr: | 79 | min by (namespace,service, integration) ( 80 | rate(alertmanager_notifications_failed_total{job="alertmanager-main",namespace="default", integration!~`.*`}[5m]) 81 | / 82 | rate(alertmanager_notifications_total{job="alertmanager-main",namespace="default", integration!~`.*`}[5m]) 83 | ) 84 | > 0.01 85 | for: 5m 86 | labels: 87 | severity: warning 88 | - alert: AlertmanagerConfigInconsistent 89 | annotations: 90 | description: Alertmanager instances within the {{$labels.job}} cluster have different configurations. 91 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerconfiginconsistent 92 | summary: Alertmanager instances within the same cluster have different configurations. 93 | expr: | 94 | count by (namespace,service) ( 95 | count_values by (namespace,service) ("config_hash", alertmanager_config_hash{job="alertmanager-main",namespace="default"}) 96 | ) 97 | != 1 98 | for: 20m 99 | labels: 100 | severity: critical 101 | - alert: AlertmanagerClusterDown 102 | annotations: 103 | description: '{{ $value | humanizePercentage }} of Alertmanager instances within the {{$labels.job}} cluster have been up for less than half of the last 5m.' 104 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclusterdown 105 | summary: Half or more of the Alertmanager instances within the same cluster are down. 106 | expr: | 107 | ( 108 | count by (namespace,service) ( 109 | avg_over_time(up{job="alertmanager-main",namespace="default"}[5m]) < 0.5 110 | ) 111 | / 112 | count by (namespace,service) ( 113 | up{job="alertmanager-main",namespace="default"} 114 | ) 115 | ) 116 | >= 0.5 117 | for: 5m 118 | labels: 119 | severity: critical 120 | - alert: AlertmanagerClusterCrashlooping 121 | annotations: 122 | description: '{{ $value | humanizePercentage }} of Alertmanager instances within the {{$labels.job}} cluster have restarted at least 5 times in the last 10m.' 123 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/alertmanager/alertmanagerclustercrashlooping 124 | summary: Half or more of the Alertmanager instances within the same cluster are crashlooping. 125 | expr: | 126 | ( 127 | count by (namespace,service) ( 128 | changes(process_start_time_seconds{job="alertmanager-main",namespace="default"}[10m]) > 4 129 | ) 130 | / 131 | count by (namespace,service) ( 132 | up{job="alertmanager-main",namespace="default"} 133 | ) 134 | ) 135 | >= 0.5 136 | for: 5m 137 | labels: 138 | severity: critical 139 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/servicemonitor/kubernetes-serviceMonitorKubelet.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: ServiceMonitor 3 | metadata: 4 | labels: 5 | app.kubernetes.io/name: kubelet 6 | name: kubelet 7 | namespace: default 8 | spec: 9 | endpoints: 10 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 11 | honorLabels: true 12 | interval: 30s 13 | metricRelabelings: 14 | - action: drop 15 | regex: kubelet_(pod_worker_latency_microseconds|pod_start_latency_microseconds|cgroup_manager_latency_microseconds|pod_worker_start_latency_microseconds|pleg_relist_latency_microseconds|pleg_relist_interval_microseconds|runtime_operations|runtime_operations_latency_microseconds|runtime_operations_errors|eviction_stats_age_microseconds|device_plugin_registration_count|device_plugin_alloc_latency_microseconds|network_plugin_operations_latency_microseconds) 16 | sourceLabels: 17 | - __name__ 18 | - action: drop 19 | regex: scheduler_(e2e_scheduling_latency_microseconds|scheduling_algorithm_predicate_evaluation|scheduling_algorithm_priority_evaluation|scheduling_algorithm_preemption_evaluation|scheduling_algorithm_latency_microseconds|binding_latency_microseconds|scheduling_latency_seconds) 20 | sourceLabels: 21 | - __name__ 22 | - action: drop 23 | regex: apiserver_(request_count|request_latencies|request_latencies_summary|dropped_requests|storage_data_key_generation_latencies_microseconds|storage_transformation_failures_total|storage_transformation_latencies_microseconds|proxy_tunnel_sync_latency_secs) 24 | sourceLabels: 25 | - __name__ 26 | - action: drop 27 | regex: kubelet_docker_(operations|operations_latency_microseconds|operations_errors|operations_timeout) 28 | sourceLabels: 29 | - __name__ 30 | - action: drop 31 | regex: reflector_(items_per_list|items_per_watch|list_duration_seconds|lists_total|short_watches_total|watch_duration_seconds|watches_total) 32 | sourceLabels: 33 | - __name__ 34 | - action: drop 35 | regex: etcd_(helper_cache_hit_count|helper_cache_miss_count|helper_cache_entry_count|object_counts|request_cache_get_latencies_summary|request_cache_add_latencies_summary|request_latencies_summary) 36 | sourceLabels: 37 | - __name__ 38 | - action: drop 39 | regex: transformation_(transformation_latencies_microseconds|failures_total) 40 | sourceLabels: 41 | - __name__ 42 | - action: drop 43 | regex: (admission_quota_controller_adds|admission_quota_controller_depth|admission_quota_controller_longest_running_processor_microseconds|admission_quota_controller_queue_latency|admission_quota_controller_unfinished_work_seconds|admission_quota_controller_work_duration|APIServiceOpenAPIAggregationControllerQueue1_adds|APIServiceOpenAPIAggregationControllerQueue1_depth|APIServiceOpenAPIAggregationControllerQueue1_longest_running_processor_microseconds|APIServiceOpenAPIAggregationControllerQueue1_queue_latency|APIServiceOpenAPIAggregationControllerQueue1_retries|APIServiceOpenAPIAggregationControllerQueue1_unfinished_work_seconds|APIServiceOpenAPIAggregationControllerQueue1_work_duration|APIServiceRegistrationController_adds|APIServiceRegistrationController_depth|APIServiceRegistrationController_longest_running_processor_microseconds|APIServiceRegistrationController_queue_latency|APIServiceRegistrationController_retries|APIServiceRegistrationController_unfinished_work_seconds|APIServiceRegistrationController_work_duration|autoregister_adds|autoregister_depth|autoregister_longest_running_processor_microseconds|autoregister_queue_latency|autoregister_retries|autoregister_unfinished_work_seconds|autoregister_work_duration|AvailableConditionController_adds|AvailableConditionController_depth|AvailableConditionController_longest_running_processor_microseconds|AvailableConditionController_queue_latency|AvailableConditionController_retries|AvailableConditionController_unfinished_work_seconds|AvailableConditionController_work_duration|crd_autoregistration_controller_adds|crd_autoregistration_controller_depth|crd_autoregistration_controller_longest_running_processor_microseconds|crd_autoregistration_controller_queue_latency|crd_autoregistration_controller_retries|crd_autoregistration_controller_unfinished_work_seconds|crd_autoregistration_controller_work_duration|crdEstablishing_adds|crdEstablishing_depth|crdEstablishing_longest_running_processor_microseconds|crdEstablishing_queue_latency|crdEstablishing_retries|crdEstablishing_unfinished_work_seconds|crdEstablishing_work_duration|crd_finalizer_adds|crd_finalizer_depth|crd_finalizer_longest_running_processor_microseconds|crd_finalizer_queue_latency|crd_finalizer_retries|crd_finalizer_unfinished_work_seconds|crd_finalizer_work_duration|crd_naming_condition_controller_adds|crd_naming_condition_controller_depth|crd_naming_condition_controller_longest_running_processor_microseconds|crd_naming_condition_controller_queue_latency|crd_naming_condition_controller_retries|crd_naming_condition_controller_unfinished_work_seconds|crd_naming_condition_controller_work_duration|crd_openapi_controller_adds|crd_openapi_controller_depth|crd_openapi_controller_longest_running_processor_microseconds|crd_openapi_controller_queue_latency|crd_openapi_controller_retries|crd_openapi_controller_unfinished_work_seconds|crd_openapi_controller_work_duration|DiscoveryController_adds|DiscoveryController_depth|DiscoveryController_longest_running_processor_microseconds|DiscoveryController_queue_latency|DiscoveryController_retries|DiscoveryController_unfinished_work_seconds|DiscoveryController_work_duration|kubeproxy_sync_proxy_rules_latency_microseconds|non_structural_schema_condition_controller_adds|non_structural_schema_condition_controller_depth|non_structural_schema_condition_controller_longest_running_processor_microseconds|non_structural_schema_condition_controller_queue_latency|non_structural_schema_condition_controller_retries|non_structural_schema_condition_controller_unfinished_work_seconds|non_structural_schema_condition_controller_work_duration|rest_client_request_latency_seconds|storage_operation_errors_total|storage_operation_status_count) 44 | sourceLabels: 45 | - __name__ 46 | port: https-metrics 47 | relabelings: 48 | - sourceLabels: 49 | - __metrics_path__ 50 | targetLabel: metrics_path 51 | scheme: https 52 | tlsConfig: 53 | insecureSkipVerify: true 54 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 55 | honorLabels: true 56 | honorTimestamps: false 57 | interval: 30s 58 | metricRelabelings: 59 | - action: drop 60 | regex: container_(network_tcp_usage_total|network_udp_usage_total|tasks_state|cpu_load_average_10s) 61 | sourceLabels: 62 | - __name__ 63 | - action: drop 64 | regex: (container_fs_.*|container_spec_.*|container_blkio_device_usage_total|container_file_descriptors|container_sockets|container_threads_max|container_threads|container_start_time_seconds|container_last_seen);; 65 | sourceLabels: 66 | - __name__ 67 | - pod 68 | - namespace 69 | path: /metrics/cadvisor 70 | port: https-metrics 71 | relabelings: 72 | - sourceLabels: 73 | - __metrics_path__ 74 | targetLabel: metrics_path 75 | scheme: https 76 | tlsConfig: 77 | insecureSkipVerify: true 78 | - bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token 79 | honorLabels: true 80 | interval: 30s 81 | path: /metrics/probes 82 | port: https-metrics 83 | relabelings: 84 | - sourceLabels: 85 | - __metrics_path__ 86 | targetLabel: metrics_path 87 | scheme: https 88 | tlsConfig: 89 | insecureSkipVerify: true 90 | jobLabel: app.kubernetes.io/name 91 | namespaceSelector: 92 | matchNames: 93 | - kube-system 94 | selector: 95 | matchLabels: 96 | app.kubernetes.io/name: kubelet 97 | -------------------------------------------------------------------------------- /chap10/exporter_basics/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 3 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 4 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 5 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 6 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 7 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 8 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 11 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 12 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 15 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 16 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 17 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 18 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 19 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 20 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 21 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 22 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 23 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 24 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 25 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 26 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 27 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 28 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 29 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 30 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 31 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 32 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 33 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 34 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 35 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 36 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 37 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 38 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 39 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 40 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 41 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 42 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 43 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 44 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 45 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 46 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 47 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 48 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 49 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 50 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 51 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 52 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 53 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 54 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 55 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 56 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 57 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 58 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 59 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 60 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 61 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 62 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 63 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 64 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 65 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 66 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 67 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 68 | github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= 69 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 70 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 71 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 72 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 73 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 74 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 75 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 76 | github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= 77 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 78 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 79 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 80 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 81 | github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= 82 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 83 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 84 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 85 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 86 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 87 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 88 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 89 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 90 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 91 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 92 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 93 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 94 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 95 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 96 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 97 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 98 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 99 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 100 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 101 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 102 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 103 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 104 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 105 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 106 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 107 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 108 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 109 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 110 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 111 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 112 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 113 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 114 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 115 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= 116 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 117 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 118 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 119 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 120 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 121 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 122 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 123 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 124 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 125 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 126 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 127 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 128 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 129 | google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= 130 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 131 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 132 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 133 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 134 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 135 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 136 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 137 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 138 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 139 | -------------------------------------------------------------------------------- /chap10/exporter_count/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 3 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 4 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 5 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 6 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 7 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 8 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 11 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 12 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 15 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 16 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 17 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 18 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 19 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 20 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 21 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 22 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 23 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 24 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 25 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 26 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 27 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 28 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 29 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 30 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 31 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 32 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 33 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 34 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 35 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 36 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 37 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 38 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 39 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 40 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 41 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 42 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 43 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 44 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 45 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 46 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 47 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 48 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 49 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 50 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 51 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 52 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 53 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 54 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 55 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 56 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 57 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 58 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 59 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 60 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 61 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 62 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 63 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 64 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 65 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 66 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 67 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 68 | github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= 69 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 70 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 71 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 72 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 73 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 74 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 75 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 76 | github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= 77 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 78 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 79 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 80 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 81 | github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= 82 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 83 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 84 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 85 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 86 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 87 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 88 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 89 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 90 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 91 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 92 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 93 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 94 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 95 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 96 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 97 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 98 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 99 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 100 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 101 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 102 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 103 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 104 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 105 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 106 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 107 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 108 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 109 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 110 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 111 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 112 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 113 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 114 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 115 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= 116 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 117 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 118 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 119 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 120 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 121 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 122 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 123 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 124 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 125 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 126 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 127 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 128 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 129 | google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= 130 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 131 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 132 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 133 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 134 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 135 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 136 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 137 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 138 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 139 | -------------------------------------------------------------------------------- /chap10/exporter_template/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 3 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 4 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 5 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 6 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 7 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 8 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 11 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 12 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 15 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 16 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 17 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 18 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 19 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 20 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 21 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 22 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 23 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 24 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 25 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 26 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 27 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 28 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 29 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 30 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 31 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 32 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 33 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 34 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 35 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 36 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 37 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 38 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 39 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 40 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 41 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 42 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 43 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 44 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 45 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 46 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 47 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 48 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 49 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 50 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 51 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 52 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 53 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 54 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 55 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 56 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 57 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 58 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 59 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 60 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 61 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 62 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 63 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 64 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 65 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 66 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 67 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 68 | github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= 69 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 70 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 71 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 72 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 73 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 74 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 75 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 76 | github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= 77 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 78 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 79 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 80 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 81 | github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= 82 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 83 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 84 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 85 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 86 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 87 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 88 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 89 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 90 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 91 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 92 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 93 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 94 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 95 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 96 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 97 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 98 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 99 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 100 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 101 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 102 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 103 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 104 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 105 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 106 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 107 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 108 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 109 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 110 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 111 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 112 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 113 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 114 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 115 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= 116 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 117 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 118 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 119 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 120 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 121 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 122 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 123 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 124 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 125 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 126 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 127 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 128 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 129 | google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= 130 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 131 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 132 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 133 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 134 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 135 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 136 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 137 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 138 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 139 | -------------------------------------------------------------------------------- /chap10/exporter_mysql/go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 3 | github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 4 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 5 | github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 6 | github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 7 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 8 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 9 | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= 10 | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= 11 | github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= 12 | github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 13 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 14 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 15 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 16 | github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 17 | github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= 18 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 19 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 20 | github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= 21 | github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= 22 | github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= 23 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 24 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 25 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 26 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 27 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 28 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 29 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 30 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 31 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 32 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 33 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 34 | github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= 35 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 36 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 37 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 38 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 39 | github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 40 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 41 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 42 | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= 43 | github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= 44 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 45 | github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 46 | github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 47 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 48 | github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= 49 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 50 | github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 51 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 52 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 53 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 54 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 55 | github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= 56 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 57 | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 58 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 59 | github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 60 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 61 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 62 | github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 63 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 64 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 65 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 66 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 67 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 68 | github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= 69 | github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= 70 | github.com/prometheus/client_golang v1.11.0 h1:HNkLOAEQMIDv/K+04rukrLx6ch7msSRwf3/SASFAGtQ= 71 | github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= 72 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 73 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 74 | github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= 75 | github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 76 | github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 77 | github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= 78 | github.com/prometheus/common v0.26.0 h1:iMAkS2TDoNWnKM+Kopnx/8tnEStIfpYA0ur0xQzzhMQ= 79 | github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= 80 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 81 | github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 82 | github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= 83 | github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= 84 | github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= 85 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 86 | github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= 87 | github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= 88 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 89 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 90 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 91 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 92 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 93 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 94 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 95 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 96 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 97 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 98 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 99 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 100 | golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 101 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 102 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 103 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 104 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 105 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 106 | golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 107 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 108 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 109 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 110 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 111 | golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 112 | golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 113 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 114 | golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 115 | golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 116 | golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 117 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40 h1:JWgyZ1qgdTaF3N3oxC+MdTV7qvEEgHo3otj+HB5CM7Q= 118 | golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 119 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 120 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 121 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 122 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= 123 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 124 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 125 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 126 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 127 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 128 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 129 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 130 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 131 | google.golang.org/protobuf v1.26.0-rc.1 h1:7QnIQpGRHE5RnLKnESfDoxm2dTapTZua5a0kS0A+VXQ= 132 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 133 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 134 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 135 | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 136 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 137 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 138 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 139 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 140 | gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 141 | -------------------------------------------------------------------------------- /chap08/prometheus-operator/manifests/rules/prometheus-prometheusRule.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: monitoring.coreos.com/v1 2 | kind: PrometheusRule 3 | metadata: 4 | labels: 5 | app.kubernetes.io/component: prometheus 6 | app.kubernetes.io/name: prometheus 7 | app.kubernetes.io/part-of: kube-prometheus 8 | app.kubernetes.io/version: 2.29.1 9 | prometheus: k8s 10 | role: alert-rules 11 | name: prometheus-k8s-prometheus-rules 12 | namespace: default 13 | spec: 14 | groups: 15 | - name: prometheus 16 | rules: 17 | - alert: PrometheusBadConfig 18 | annotations: 19 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has failed to reload its configuration. 20 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusbadconfig 21 | summary: Failed Prometheus configuration reload. 22 | expr: | 23 | # Without max_over_time, failed scrapes could create false negatives, see 24 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 25 | max_over_time(prometheus_config_last_reload_successful{job="prometheus-k8s",namespace="default"}[5m]) == 0 26 | for: 10m 27 | labels: 28 | severity: critical 29 | - alert: PrometheusNotificationQueueRunningFull 30 | annotations: 31 | description: Alert notification queue of Prometheus {{$labels.namespace}}/{{$labels.pod}} is running full. 32 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusnotificationqueuerunningfull 33 | summary: Prometheus alert notification queue predicted to run full in less than 30m. 34 | expr: | 35 | # Without min_over_time, failed scrapes could create false negatives, see 36 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 37 | ( 38 | predict_linear(prometheus_notifications_queue_length{job="prometheus-k8s",namespace="default"}[5m], 60 * 30) 39 | > 40 | min_over_time(prometheus_notifications_queue_capacity{job="prometheus-k8s",namespace="default"}[5m]) 41 | ) 42 | for: 15m 43 | labels: 44 | severity: warning 45 | - alert: PrometheusErrorSendingAlertsToSomeAlertmanagers 46 | annotations: 47 | description: '{{ printf "%.1f" $value }}% errors while sending alerts from Prometheus {{$labels.namespace}}/{{$labels.pod}} to Alertmanager {{$labels.alertmanager}}.' 48 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheuserrorsendingalertstosomealertmanagers 49 | summary: Prometheus has encountered more than 1% errors sending alerts to a specific Alertmanager. 50 | expr: | 51 | ( 52 | rate(prometheus_notifications_errors_total{job="prometheus-k8s",namespace="default"}[5m]) 53 | / 54 | rate(prometheus_notifications_sent_total{job="prometheus-k8s",namespace="default"}[5m]) 55 | ) 56 | * 100 57 | > 1 58 | for: 15m 59 | labels: 60 | severity: warning 61 | - alert: PrometheusNotConnectedToAlertmanagers 62 | annotations: 63 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} is not connected to any Alertmanagers. 64 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusnotconnectedtoalertmanagers 65 | summary: Prometheus is not connected to any Alertmanagers. 66 | expr: | 67 | # Without max_over_time, failed scrapes could create false negatives, see 68 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 69 | max_over_time(prometheus_notifications_alertmanagers_discovered{job="prometheus-k8s",namespace="default"}[5m]) < 1 70 | for: 10m 71 | labels: 72 | severity: warning 73 | - alert: PrometheusTSDBReloadsFailing 74 | annotations: 75 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has detected {{$value | humanize}} reload failures over the last 3h. 76 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheustsdbreloadsfailing 77 | summary: Prometheus has issues reloading blocks from disk. 78 | expr: | 79 | increase(prometheus_tsdb_reloads_failures_total{job="prometheus-k8s",namespace="default"}[3h]) > 0 80 | for: 4h 81 | labels: 82 | severity: warning 83 | - alert: PrometheusTSDBCompactionsFailing 84 | annotations: 85 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has detected {{$value | humanize}} compaction failures over the last 3h. 86 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheustsdbcompactionsfailing 87 | summary: Prometheus has issues compacting blocks. 88 | expr: | 89 | increase(prometheus_tsdb_compactions_failed_total{job="prometheus-k8s",namespace="default"}[3h]) > 0 90 | for: 4h 91 | labels: 92 | severity: warning 93 | - alert: PrometheusNotIngestingSamples 94 | annotations: 95 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} is not ingesting samples. 96 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusnotingestingsamples 97 | summary: Prometheus is not ingesting samples. 98 | expr: | 99 | ( 100 | rate(prometheus_tsdb_head_samples_appended_total{job="prometheus-k8s",namespace="default"}[5m]) <= 0 101 | and 102 | ( 103 | sum without(scrape_job) (prometheus_target_metadata_cache_entries{job="prometheus-k8s",namespace="default"}) > 0 104 | or 105 | sum without(rule_group) (prometheus_rule_group_rules{job="prometheus-k8s",namespace="default"}) > 0 106 | ) 107 | ) 108 | for: 10m 109 | labels: 110 | severity: warning 111 | - alert: PrometheusDuplicateTimestamps 112 | annotations: 113 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} is dropping {{ printf "%.4g" $value }} samples/s with different values but duplicated timestamp. 114 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusduplicatetimestamps 115 | summary: Prometheus is dropping samples with duplicate timestamps. 116 | expr: | 117 | rate(prometheus_target_scrapes_sample_duplicate_timestamp_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 118 | for: 10m 119 | labels: 120 | severity: warning 121 | - alert: PrometheusOutOfOrderTimestamps 122 | annotations: 123 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} is dropping {{ printf "%.4g" $value }} samples/s with timestamps arriving out of order. 124 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusoutofordertimestamps 125 | summary: Prometheus drops samples with out-of-order timestamps. 126 | expr: | 127 | rate(prometheus_target_scrapes_sample_out_of_order_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 128 | for: 10m 129 | labels: 130 | severity: warning 131 | - alert: PrometheusRemoteStorageFailures 132 | annotations: 133 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} failed to send {{ printf "%.1f" $value }}% of the samples to {{ $labels.remote_name}}:{{ $labels.url }} 134 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusremotestoragefailures 135 | summary: Prometheus fails to send samples to remote storage. 136 | expr: | 137 | ( 138 | (rate(prometheus_remote_storage_failed_samples_total{job="prometheus-k8s",namespace="default"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="prometheus-k8s",namespace="default"}[5m])) 139 | / 140 | ( 141 | (rate(prometheus_remote_storage_failed_samples_total{job="prometheus-k8s",namespace="default"}[5m]) or rate(prometheus_remote_storage_samples_failed_total{job="prometheus-k8s",namespace="default"}[5m])) 142 | + 143 | (rate(prometheus_remote_storage_succeeded_samples_total{job="prometheus-k8s",namespace="default"}[5m]) or rate(prometheus_remote_storage_samples_total{job="prometheus-k8s",namespace="default"}[5m])) 144 | ) 145 | ) 146 | * 100 147 | > 1 148 | for: 15m 149 | labels: 150 | severity: critical 151 | - alert: PrometheusRemoteWriteBehind 152 | annotations: 153 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} remote write is {{ printf "%.1f" $value }}s behind for {{ $labels.remote_name}}:{{ $labels.url }}. 154 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusremotewritebehind 155 | summary: Prometheus remote write is behind. 156 | expr: | 157 | # Without max_over_time, failed scrapes could create false negatives, see 158 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 159 | ( 160 | max_over_time(prometheus_remote_storage_highest_timestamp_in_seconds{job="prometheus-k8s",namespace="default"}[5m]) 161 | - ignoring(remote_name, url) group_right 162 | max_over_time(prometheus_remote_storage_queue_highest_sent_timestamp_seconds{job="prometheus-k8s",namespace="default"}[5m]) 163 | ) 164 | > 120 165 | for: 15m 166 | labels: 167 | severity: critical 168 | - alert: PrometheusRemoteWriteDesiredShards 169 | annotations: 170 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} remote write desired shards calculation wants to run {{ $value }} shards for queue {{ $labels.remote_name}}:{{ $labels.url }}, which is more than the max of {{ printf `prometheus_remote_storage_shards_max{instance="%s",job="prometheus-k8s",namespace="default"}` $labels.instance | query | first | value }}. 171 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusremotewritedesiredshards 172 | summary: Prometheus remote write desired shards calculation wants to run more than configured max shards. 173 | expr: | 174 | # Without max_over_time, failed scrapes could create false negatives, see 175 | # https://www.robustperception.io/alerting-on-gauges-in-prometheus-2-0 for details. 176 | ( 177 | max_over_time(prometheus_remote_storage_shards_desired{job="prometheus-k8s",namespace="default"}[5m]) 178 | > 179 | max_over_time(prometheus_remote_storage_shards_max{job="prometheus-k8s",namespace="default"}[5m]) 180 | ) 181 | for: 15m 182 | labels: 183 | severity: warning 184 | - alert: PrometheusRuleFailures 185 | annotations: 186 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has failed to evaluate {{ printf "%.0f" $value }} rules in the last 5m. 187 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusrulefailures 188 | summary: Prometheus is failing rule evaluations. 189 | expr: | 190 | increase(prometheus_rule_evaluation_failures_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 191 | for: 15m 192 | labels: 193 | severity: critical 194 | - alert: PrometheusMissingRuleEvaluations 195 | annotations: 196 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has missed {{ printf "%.0f" $value }} rule group evaluations in the last 5m. 197 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheusmissingruleevaluations 198 | summary: Prometheus is missing rule evaluations due to slow rule group evaluation. 199 | expr: | 200 | increase(prometheus_rule_group_iterations_missed_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 201 | for: 15m 202 | labels: 203 | severity: warning 204 | - alert: PrometheusTargetLimitHit 205 | annotations: 206 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has dropped {{ printf "%.0f" $value }} targets because the number of targets exceeded the configured target_limit. 207 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheustargetlimithit 208 | summary: Prometheus has dropped targets because some scrape configs have exceeded the targets limit. 209 | expr: | 210 | increase(prometheus_target_scrape_pool_exceeded_target_limit_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 211 | for: 15m 212 | labels: 213 | severity: warning 214 | - alert: PrometheusLabelLimitHit 215 | annotations: 216 | description: Prometheus {{$labels.namespace}}/{{$labels.pod}} has dropped {{ printf "%.0f" $value }} targets because some samples exceeded the configured label_limit, label_name_length_limit or label_value_length_limit. 217 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheuslabellimithit 218 | summary: Prometheus has dropped targets because some scrape configs have exceeded the labels limit. 219 | expr: | 220 | increase(prometheus_target_scrape_pool_exceeded_label_limits_total{job="prometheus-k8s",namespace="default"}[5m]) > 0 221 | for: 15m 222 | labels: 223 | severity: warning 224 | - alert: PrometheusTargetSyncFailure 225 | annotations: 226 | description: '{{ printf "%.0f" $value }} targets in Prometheus {{$labels.namespace}}/{{$labels.pod}} have failed to sync because invalid configuration was supplied.' 227 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheustargetsyncfailure 228 | summary: Prometheus has failed to sync targets. 229 | expr: | 230 | increase(prometheus_target_sync_failed_total{job="prometheus-k8s",namespace="default"}[30m]) > 0 231 | for: 5m 232 | labels: 233 | severity: critical 234 | - alert: PrometheusErrorSendingAlertsToAnyAlertmanager 235 | annotations: 236 | description: '{{ printf "%.1f" $value }}% minimum errors while sending alerts from Prometheus {{$labels.namespace}}/{{$labels.pod}} to any Alertmanager.' 237 | runbook_url: https://runbooks.prometheus-operator.dev/runbooks/prometheus/prometheuserrorsendingalertstoanyalertmanager 238 | summary: Prometheus encounters more than 3% errors sending alerts to any Alertmanager. 239 | expr: | 240 | min without (alertmanager) ( 241 | rate(prometheus_notifications_errors_total{job="prometheus-k8s",namespace="default",alertmanager!~``}[5m]) 242 | / 243 | rate(prometheus_notifications_sent_total{job="prometheus-k8s",namespace="default",alertmanager!~``}[5m]) 244 | ) 245 | * 100 246 | > 3 247 | for: 15m 248 | labels: 249 | severity: critical 250 | -------------------------------------------------------------------------------- /chap04/apache/httpd.conf: -------------------------------------------------------------------------------- 1 | # 2 | # This is the main Apache HTTP server configuration file. It contains the 3 | # configuration directives that give the server its instructions. 4 | # See for detailed information. 5 | # In particular, see 6 | # 7 | # for a discussion of each configuration directive. 8 | # 9 | # Do NOT simply read the instructions in here without understanding 10 | # what they do. They're here only as hints or reminders. If you are unsure 11 | # consult the online docs. You have been warned. 12 | # 13 | # Configuration and logfile names: If the filenames you specify for many 14 | # of the server's control files begin with "/" (or "drive:/" for Win32), the 15 | # server will use that explicit path. If the filenames do *not* begin 16 | # with "/", the value of ServerRoot is prepended -- so "logs/access_log" 17 | # with ServerRoot set to "/usr/local/apache2" will be interpreted by the 18 | # server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" 19 | # will be interpreted as '/logs/access_log'. 20 | 21 | # 22 | # ServerRoot: The top of the directory tree under which the server's 23 | # configuration, error, and log files are kept. 24 | # 25 | # Do not add a slash at the end of the directory path. If you point 26 | # ServerRoot at a non-local disk, be sure to specify a local disk on the 27 | # Mutex directive, if file-based mutexes are used. If you wish to share the 28 | # same ServerRoot for multiple httpd daemons, you will need to change at 29 | # least PidFile. 30 | # 31 | ServerRoot "/usr/local/apache2" 32 | 33 | # 34 | # Mutex: Allows you to set the mutex mechanism and mutex file directory 35 | # for individual mutexes, or change the global defaults 36 | # 37 | # Uncomment and change the directory if mutexes are file-based and the default 38 | # mutex file directory is not on a local disk or is not appropriate for some 39 | # other reason. 40 | # 41 | # Mutex default:logs 42 | 43 | # 44 | # Listen: Allows you to bind Apache to specific IP addresses and/or 45 | # ports, instead of the default. See also the 46 | # directive. 47 | # 48 | # Change this to Listen on specific IP addresses as shown below to 49 | # prevent Apache from glomming onto all bound IP addresses. 50 | # 51 | #Listen 12.34.56.78:80 52 | Listen 80 53 | 54 | # 55 | # Dynamic Shared Object (DSO) Support 56 | # 57 | # To be able to use the functionality of a module which was built as a DSO you 58 | # have to place corresponding `LoadModule' lines at this location so the 59 | # directives contained in it are actually available _before_ they are used. 60 | # Statically compiled modules (those listed by `httpd -l') do not need 61 | # to be loaded here. 62 | # 63 | # Example: 64 | # LoadModule foo_module modules/mod_foo.so 65 | # 66 | LoadModule mpm_event_module modules/mod_mpm_event.so 67 | #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 68 | #LoadModule mpm_worker_module modules/mod_mpm_worker.so 69 | LoadModule authn_file_module modules/mod_authn_file.so 70 | #LoadModule authn_dbm_module modules/mod_authn_dbm.so 71 | #LoadModule authn_anon_module modules/mod_authn_anon.so 72 | #LoadModule authn_dbd_module modules/mod_authn_dbd.so 73 | #LoadModule authn_socache_module modules/mod_authn_socache.so 74 | LoadModule authn_core_module modules/mod_authn_core.so 75 | LoadModule authz_host_module modules/mod_authz_host.so 76 | LoadModule authz_groupfile_module modules/mod_authz_groupfile.so 77 | LoadModule authz_user_module modules/mod_authz_user.so 78 | #LoadModule authz_dbm_module modules/mod_authz_dbm.so 79 | #LoadModule authz_owner_module modules/mod_authz_owner.so 80 | #LoadModule authz_dbd_module modules/mod_authz_dbd.so 81 | LoadModule authz_core_module modules/mod_authz_core.so 82 | #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so 83 | #LoadModule authnz_fcgi_module modules/mod_authnz_fcgi.so 84 | LoadModule access_compat_module modules/mod_access_compat.so 85 | LoadModule auth_basic_module modules/mod_auth_basic.so 86 | #LoadModule auth_form_module modules/mod_auth_form.so 87 | #LoadModule auth_digest_module modules/mod_auth_digest.so 88 | #LoadModule allowmethods_module modules/mod_allowmethods.so 89 | #LoadModule isapi_module modules/mod_isapi.so 90 | #LoadModule file_cache_module modules/mod_file_cache.so 91 | #LoadModule cache_module modules/mod_cache.so 92 | #LoadModule cache_disk_module modules/mod_cache_disk.so 93 | #LoadModule cache_socache_module modules/mod_cache_socache.so 94 | #LoadModule socache_shmcb_module modules/mod_socache_shmcb.so 95 | #LoadModule socache_dbm_module modules/mod_socache_dbm.so 96 | #LoadModule socache_memcache_module modules/mod_socache_memcache.so 97 | #LoadModule socache_redis_module modules/mod_socache_redis.so 98 | #LoadModule watchdog_module modules/mod_watchdog.so 99 | #LoadModule macro_module modules/mod_macro.so 100 | #LoadModule dbd_module modules/mod_dbd.so 101 | #LoadModule bucketeer_module modules/mod_bucketeer.so 102 | #LoadModule dumpio_module modules/mod_dumpio.so 103 | #LoadModule echo_module modules/mod_echo.so 104 | #LoadModule example_hooks_module modules/mod_example_hooks.so 105 | #LoadModule case_filter_module modules/mod_case_filter.so 106 | #LoadModule case_filter_in_module modules/mod_case_filter_in.so 107 | #LoadModule example_ipc_module modules/mod_example_ipc.so 108 | #LoadModule buffer_module modules/mod_buffer.so 109 | #LoadModule data_module modules/mod_data.so 110 | #LoadModule ratelimit_module modules/mod_ratelimit.so 111 | LoadModule reqtimeout_module modules/mod_reqtimeout.so 112 | #LoadModule ext_filter_module modules/mod_ext_filter.so 113 | #LoadModule request_module modules/mod_request.so 114 | #LoadModule include_module modules/mod_include.so 115 | LoadModule filter_module modules/mod_filter.so 116 | #LoadModule reflector_module modules/mod_reflector.so 117 | #LoadModule substitute_module modules/mod_substitute.so 118 | #LoadModule sed_module modules/mod_sed.so 119 | #LoadModule charset_lite_module modules/mod_charset_lite.so 120 | #LoadModule deflate_module modules/mod_deflate.so 121 | #LoadModule xml2enc_module modules/mod_xml2enc.so 122 | #LoadModule proxy_html_module modules/mod_proxy_html.so 123 | #LoadModule brotli_module modules/mod_brotli.so 124 | LoadModule mime_module modules/mod_mime.so 125 | #LoadModule ldap_module modules/mod_ldap.so 126 | LoadModule log_config_module modules/mod_log_config.so 127 | #LoadModule log_debug_module modules/mod_log_debug.so 128 | #LoadModule log_forensic_module modules/mod_log_forensic.so 129 | #LoadModule logio_module modules/mod_logio.so 130 | #LoadModule lua_module modules/mod_lua.so 131 | LoadModule env_module modules/mod_env.so 132 | #LoadModule mime_magic_module modules/mod_mime_magic.so 133 | #LoadModule cern_meta_module modules/mod_cern_meta.so 134 | #LoadModule expires_module modules/mod_expires.so 135 | LoadModule headers_module modules/mod_headers.so 136 | #LoadModule ident_module modules/mod_ident.so 137 | #LoadModule usertrack_module modules/mod_usertrack.so 138 | #LoadModule unique_id_module modules/mod_unique_id.so 139 | LoadModule setenvif_module modules/mod_setenvif.so 140 | LoadModule version_module modules/mod_version.so 141 | #LoadModule remoteip_module modules/mod_remoteip.so 142 | #LoadModule proxy_module modules/mod_proxy.so 143 | #LoadModule proxy_connect_module modules/mod_proxy_connect.so 144 | #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 145 | #LoadModule proxy_http_module modules/mod_proxy_http.so 146 | #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so 147 | #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so 148 | #LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so 149 | #LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so 150 | #LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so 151 | #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 152 | #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 153 | #LoadModule proxy_express_module modules/mod_proxy_express.so 154 | #LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so 155 | #LoadModule session_module modules/mod_session.so 156 | #LoadModule session_cookie_module modules/mod_session_cookie.so 157 | #LoadModule session_crypto_module modules/mod_session_crypto.so 158 | #LoadModule session_dbd_module modules/mod_session_dbd.so 159 | #LoadModule slotmem_shm_module modules/mod_slotmem_shm.so 160 | #LoadModule slotmem_plain_module modules/mod_slotmem_plain.so 161 | #LoadModule ssl_module modules/mod_ssl.so 162 | #LoadModule optional_hook_export_module modules/mod_optional_hook_export.so 163 | #LoadModule optional_hook_import_module modules/mod_optional_hook_import.so 164 | #LoadModule optional_fn_import_module modules/mod_optional_fn_import.so 165 | #LoadModule optional_fn_export_module modules/mod_optional_fn_export.so 166 | #LoadModule dialup_module modules/mod_dialup.so 167 | #LoadModule http2_module modules/mod_http2.so 168 | #LoadModule proxy_http2_module modules/mod_proxy_http2.so 169 | #LoadModule md_module modules/mod_md.so 170 | #LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so 171 | #LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so 172 | #LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so 173 | #LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so 174 | LoadModule unixd_module modules/mod_unixd.so 175 | #LoadModule heartbeat_module modules/mod_heartbeat.so 176 | #LoadModule heartmonitor_module modules/mod_heartmonitor.so 177 | #LoadModule dav_module modules/mod_dav.so 178 | LoadModule status_module modules/mod_status.so 179 | LoadModule autoindex_module modules/mod_autoindex.so 180 | #LoadModule asis_module modules/mod_asis.so 181 | #LoadModule info_module modules/mod_info.so 182 | #LoadModule suexec_module modules/mod_suexec.so 183 | 184 | #LoadModule cgid_module modules/mod_cgid.so 185 | 186 | 187 | #LoadModule cgi_module modules/mod_cgi.so 188 | 189 | #LoadModule dav_fs_module modules/mod_dav_fs.so 190 | #LoadModule dav_lock_module modules/mod_dav_lock.so 191 | #LoadModule vhost_alias_module modules/mod_vhost_alias.so 192 | #LoadModule negotiation_module modules/mod_negotiation.so 193 | LoadModule dir_module modules/mod_dir.so 194 | #LoadModule imagemap_module modules/mod_imagemap.so 195 | #LoadModule actions_module modules/mod_actions.so 196 | #LoadModule speling_module modules/mod_speling.so 197 | #LoadModule userdir_module modules/mod_userdir.so 198 | LoadModule alias_module modules/mod_alias.so 199 | #LoadModule rewrite_module modules/mod_rewrite.so 200 | 201 | 202 | # 203 | # If you wish httpd to run as a different user or group, you must run 204 | # httpd as root initially and it will switch. 205 | # 206 | # User/Group: The name (or #number) of the user/group to run httpd as. 207 | # It is usually good practice to create a dedicated user and group for 208 | # running httpd, as with most system services. 209 | # 210 | User daemon 211 | Group daemon 212 | 213 | 214 | 215 | # 'Main' server configuration 216 | # 217 | # The directives in this section set up the values used by the 'main' 218 | # server, which responds to any requests that aren't handled by a 219 | # definition. These values also provide defaults for 220 | # any containers you may define later in the file. 221 | # 222 | # All of these directives may appear inside containers, 223 | # in which case these default settings will be overridden for the 224 | # virtual host being defined. 225 | # 226 | 227 | # 228 | # ServerAdmin: Your address, where problems with the server should be 229 | # e-mailed. This address appears on some server-generated pages, such 230 | # as error documents. e.g. admin@your-domain.com 231 | # 232 | ServerAdmin you@example.com 233 | 234 | # 235 | # ServerName gives the name and port that the server uses to identify itself. 236 | # This can often be determined automatically, but we recommend you specify 237 | # it explicitly to prevent problems during startup. 238 | # 239 | # If your host doesn't have a registered DNS name, enter its IP address here. 240 | # 241 | #ServerName www.example.com:80 242 | 243 | # 244 | # Deny access to the entirety of your server's filesystem. You must 245 | # explicitly permit access to web content directories in other 246 | # blocks below. 247 | # 248 | 249 | AllowOverride none 250 | Require all denied 251 | 252 | 253 | # 254 | # Note that from this point forward you must specifically allow 255 | # particular features to be enabled - so if something's not working as 256 | # you might expect, make sure that you have specifically enabled it 257 | # below. 258 | # 259 | 260 | # 261 | # DocumentRoot: The directory out of which you will serve your 262 | # documents. By default, all requests are taken from this directory, but 263 | # symbolic links and aliases may be used to point to other locations. 264 | # 265 | DocumentRoot "/usr/local/apache2/htdocs" 266 | 267 | # 268 | # Possible values for the Options directive are "None", "All", 269 | # or any combination of: 270 | # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews 271 | # 272 | # Note that "MultiViews" must be named *explicitly* --- "Options All" 273 | # doesn't give it to you. 274 | # 275 | # The Options directive is both complicated and important. Please see 276 | # http://httpd.apache.org/docs/2.4/mod/core.html#options 277 | # for more information. 278 | # 279 | Options Indexes FollowSymLinks 280 | 281 | # 282 | # AllowOverride controls what directives may be placed in .htaccess files. 283 | # It can be "All", "None", or any combination of the keywords: 284 | # AllowOverride FileInfo AuthConfig Limit 285 | # 286 | AllowOverride None 287 | 288 | # 289 | # Controls who can get stuff from this server. 290 | # 291 | Require all granted 292 | 293 | 294 | # 295 | # DirectoryIndex: sets the file that Apache will serve if a directory 296 | # is requested. 297 | # 298 | 299 | DirectoryIndex index.html 300 | 301 | 302 | # 303 | # The following lines prevent .htaccess and .htpasswd files from being 304 | # viewed by Web clients. 305 | # 306 | 307 | Require all denied 308 | 309 | 310 | # 311 | # ErrorLog: The location of the error log file. 312 | # If you do not specify an ErrorLog directive within a 313 | # container, error messages relating to that virtual host will be 314 | # logged here. If you *do* define an error logfile for a 315 | # container, that host's errors will be logged there and not here. 316 | # 317 | ErrorLog /proc/self/fd/2 318 | 319 | # 320 | # LogLevel: Control the number of messages logged to the error_log. 321 | # Possible values include: debug, info, notice, warn, error, crit, 322 | # alert, emerg. 323 | # 324 | LogLevel warn 325 | 326 | 327 | # 328 | # The following directives define some format nicknames for use with 329 | # a CustomLog directive (see below). 330 | # 331 | LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 332 | LogFormat "%h %l %u %t \"%r\" %>s %b" common 333 | 334 | 335 | # You need to enable mod_logio.c to use %I and %O 336 | LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio 337 | 338 | 339 | # 340 | # The location and format of the access logfile (Common Logfile Format). 341 | # If you do not define any access logfiles within a 342 | # container, they will be logged here. Contrariwise, if you *do* 343 | # define per- access logfiles, transactions will be 344 | # logged therein and *not* in this file. 345 | # 346 | CustomLog /proc/self/fd/1 common 347 | 348 | # 349 | # If you prefer a logfile with access, agent, and referer information 350 | # (Combined Logfile Format) you can use the following directive. 351 | # 352 | #CustomLog "logs/access_log" combined 353 | 354 | 355 | 356 | # 357 | # Redirect: Allows you to tell clients about documents that used to 358 | # exist in your server's namespace, but do not anymore. The client 359 | # will make a new request for the document at its new location. 360 | # Example: 361 | # Redirect permanent /foo http://www.example.com/bar 362 | 363 | # 364 | # Alias: Maps web paths into filesystem paths and is used to 365 | # access content that does not live under the DocumentRoot. 366 | # Example: 367 | # Alias /webpath /full/filesystem/path 368 | # 369 | # If you include a trailing / on /webpath then the server will 370 | # require it to be present in the URL. You will also likely 371 | # need to provide a section to allow access to 372 | # the filesystem path. 373 | 374 | # 375 | # ScriptAlias: This controls which directories contain server scripts. 376 | # ScriptAliases are essentially the same as Aliases, except that 377 | # documents in the target directory are treated as applications and 378 | # run by the server when requested rather than as documents sent to the 379 | # client. The same rules about trailing "/" apply to ScriptAlias 380 | # directives as to Alias. 381 | # 382 | ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/" 383 | 384 | 385 | 386 | 387 | # 388 | # ScriptSock: On threaded servers, designate the path to the UNIX 389 | # socket used to communicate with the CGI daemon of mod_cgid. 390 | # 391 | #Scriptsock cgisock 392 | 393 | 394 | # 395 | # "/usr/local/apache2/cgi-bin" should be changed to whatever your ScriptAliased 396 | # CGI directory exists, if you have that configured. 397 | # 398 | 399 | AllowOverride None 400 | Options None 401 | Require all granted 402 | 403 | 404 | 405 | # 406 | # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied 407 | # backend servers which have lingering "httpoxy" defects. 408 | # 'Proxy' request header is undefined by the IETF, not listed by IANA 409 | # 410 | RequestHeader unset Proxy early 411 | 412 | 413 | 414 | # 415 | # TypesConfig points to the file containing the list of mappings from 416 | # filename extension to MIME-type. 417 | # 418 | TypesConfig conf/mime.types 419 | 420 | # 421 | # AddType allows you to add to or override the MIME configuration 422 | # file specified in TypesConfig for specific file types. 423 | # 424 | #AddType application/x-gzip .tgz 425 | # 426 | # AddEncoding allows you to have certain browsers uncompress 427 | # information on the fly. Note: Not all browsers support this. 428 | # 429 | #AddEncoding x-compress .Z 430 | #AddEncoding x-gzip .gz .tgz 431 | # 432 | # If the AddEncoding directives above are commented-out, then you 433 | # probably should define those extensions to indicate media types: 434 | # 435 | AddType application/x-compress .Z 436 | AddType application/x-gzip .gz .tgz 437 | 438 | # 439 | # AddHandler allows you to map certain file extensions to "handlers": 440 | # actions unrelated to filetype. These can be either built into the server 441 | # or added with the Action directive (see below) 442 | # 443 | # To use CGI scripts outside of ScriptAliased directories: 444 | # (You will also need to add "ExecCGI" to the "Options" directive.) 445 | # 446 | #AddHandler cgi-script .cgi 447 | 448 | # For type maps (negotiated resources): 449 | #AddHandler type-map var 450 | 451 | # 452 | # Filters allow you to process content before it is sent to the client. 453 | # 454 | # To parse .shtml files for server-side includes (SSI): 455 | # (You will also need to add "Includes" to the "Options" directive.) 456 | # 457 | #AddType text/html .shtml 458 | #AddOutputFilter INCLUDES .shtml 459 | 460 | 461 | # 462 | # The mod_mime_magic module allows the server to use various hints from the 463 | # contents of the file itself to determine its type. The MIMEMagicFile 464 | # directive tells the module where the hint definitions are located. 465 | # 466 | #MIMEMagicFile conf/magic 467 | 468 | # 469 | # Customizable error responses come in three flavors: 470 | # 1) plain text 2) local redirects 3) external redirects 471 | # 472 | # Some examples: 473 | #ErrorDocument 500 "The server made a boo boo." 474 | #ErrorDocument 404 /missing.html 475 | #ErrorDocument 404 "/cgi-bin/missing_handler.pl" 476 | #ErrorDocument 402 http://www.example.com/subscription_info.html 477 | # 478 | 479 | # 480 | # MaxRanges: Maximum number of Ranges in a request before 481 | # returning the entire resource, or one of the special 482 | # values 'default', 'none' or 'unlimited'. 483 | # Default setting is to accept 200 Ranges. 484 | #MaxRanges unlimited 485 | 486 | # 487 | # EnableMMAP and EnableSendfile: On systems that support it, 488 | # memory-mapping or the sendfile syscall may be used to deliver 489 | # files. This usually improves server performance, but must 490 | # be turned off when serving from networked-mounted 491 | # filesystems or if support for these functions is otherwise 492 | # broken on your system. 493 | # Defaults: EnableMMAP On, EnableSendfile Off 494 | # 495 | #EnableMMAP off 496 | #EnableSendfile on 497 | 498 | # Supplemental configuration 499 | # 500 | # The configuration files in the conf/extra/ directory can be 501 | # included to add extra features or to modify the default configuration of 502 | # the server, or you may simply copy their contents here and change as 503 | # necessary. 504 | 505 | # Server-pool management (MPM specific) 506 | #Include conf/extra/httpd-mpm.conf 507 | 508 | # Multi-language error messages 509 | #Include conf/extra/httpd-multilang-errordoc.conf 510 | 511 | # Fancy directory listings 512 | #Include conf/extra/httpd-autoindex.conf 513 | 514 | # Language settings 515 | #Include conf/extra/httpd-languages.conf 516 | 517 | # User home directories 518 | #Include conf/extra/httpd-userdir.conf 519 | 520 | # Real-time info on requests and configuration 521 | #Include conf/extra/httpd-info.conf 522 | 523 | # Virtual hosts 524 | #Include conf/extra/httpd-vhosts.conf 525 | 526 | # Local access to the Apache HTTP Server Manual 527 | #Include conf/extra/httpd-manual.conf 528 | 529 | # Distributed authoring and versioning (WebDAV) 530 | #Include conf/extra/httpd-dav.conf 531 | 532 | # Various default settings 533 | #Include conf/extra/httpd-default.conf 534 | 535 | # Configure mod_proxy_html to understand HTML4/XHTML1 536 | 537 | Include conf/extra/proxy-html.conf 538 | 539 | 540 | # Secure (SSL/TLS) connections 541 | #Include conf/extra/httpd-ssl.conf 542 | # 543 | # Note: The following must must be present to support 544 | # starting without SSL on platforms with no /dev/random equivalent 545 | # but a statically compiled-in mod_ssl. 546 | # 547 | 548 | SSLRandomSeed startup builtin 549 | SSLRandomSeed connect builtin 550 | 551 | 552 | 553 | SetHandler server-status 554 | 555 | # Order Deny,Allow 556 | # Deny from all 557 | # Allow from localhost 558 | --------------------------------------------------------------------------------