├── .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 |
--------------------------------------------------------------------------------