「Grafana Loki」- 快速部署(测试、体验、实验)

问题描述
通过 Docker Compose 方式,进行开始入门和体验 Grafana Loki 服务;
该笔记将记录:部署测试使用的 Grafana Loki 的过程,以及相关问题的解决办法。
解决方案
依赖环境
Docker Docker Compose
下载配置

wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml -O loki-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/promtail-local-config.yaml -O promtail-local-config.yaml
wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml

运行服务

docker-compose up -d

访问服务

# firefox http://ip-address:3000/

Grafana / Explore / Log browser>

{container=”evaluate-loki_flog_1″} |= “GET”

Run Query

参考文献
Getting started | Grafana Loki documentation[……]

READ MORE

「LOGGING」- 部署 Grafana Loki 服务,实现日志集中管理

问题描述
我们采用 Promtail 来采集日志,Grafana Loki 来存储日志,并对日志进行集中管理(即单个 Grafana Loki 实例来管理多个集群日志)。
该笔记将记录:采用 Grafana Loki 进行日志集中管理的方法,若干需要考虑的问题,以及相关问题的解决办法;
解决方案
在部署前,我们需要考虑的问题:
部署方式
我们直接采用 Grafana Loki 的微服务式(分布式)部署方式,原因如下: 1)官方文档也推荐该部署模式,官方文档也表示模式也最适合 Kubernetes 部署; 2)也符合我们的部署场景,我们需要在 Kubernetes Cluster 中运行日志采集;
我们采用 Helm 进行部署,原因是不用引入新的技术栈。而未采用官方推荐的 Tanka 进行部署,原因是 Tanka 暂时还没有成为像 Helm 那样广泛使用,引入新的工具需要额外的学习成本、维护成本、培训成本;
代理认证
在我们的场景中,鉴于是多集群日志管理,流量需要通过公网(部署 VPN 需要而外成本,所以流量目前是通过公网的),所以我们需要对 Grafana Loki 进行认证,防止非法访问。
但是 Grafana Loki 本身并不提供认证功能(Authentication),需要增加前端服务来提供认证,比如 Nginx Reverse Proxy 等等。
不过,这是个常见需求,所以 Grafana Loki 的 Helm Chart 包含 Basic Auth 特性,在部署的设置打开相关配置即可。
关于 Basic Auth 的位置 1) 虽然 Basic Auth 是在 Grafana Loki Helm Chart 的 ingress 中进行设置,但是实际的 Basic Auth 是添加到 Nginx 当中的; 2)所以不管 Grafana 还是 Promtail 服务,当访问 Gateway 服务时,都需要配置相关的 Basic Auth 认证;
日志标签
我们需要区分来自不同集群的日志,即 Promtail 需要增加标签,以表明该日志所来自的集群。
如果在 scrape_configs/Job 中增加,则每个都需要增加响应的标签。所以,我们使用 clients.external_labels 属性,来为所有 clients 增加标签;
日志保留
Retention | Grafana Loki documentation
Compactor 执行日志清理工作,而日志保留时长通过 limits_config 进行控制;
部署 Loki 集群

helm repo add grafana https://grafan[……]

READ MORE

「Grafana-Loki」- 常见问题处理

认证(⇒ Operations/Authentication)
Authentication | Grafana Loki documentation
Grafana Loki 服务并不提供认证层,官方文件建议在前端的 Reverse Porxy 进行相关的认证服务。
题外话,Reverse Proxy 同时需要负责多租户的 X-Scope-OrgID HTTP Header 的添加;
Template variable service failed Query error: 504
query_range request returns a 504 · Issue #4721 · grafana/loki · GitHub
问题描述
在 Loki 中,如果时间范围选择的较旧,则会产生如下错误:

Templating
Template variable service failed Query error: 504

// 这里的主要错误还是 504 网关问题

原因分析
根据 Loki 架构,我们查看 Querier 日志,发现在索引下载或日志取回的过程中,请求被取消

level=error ts=2022-11-16T12:57:19.037772819Z caller=frontend_processor.go:69 msg=”error processing requests” address=10.34.0.76:9095 err=”rpc error: code = Unknown desc = context canceled”
level=error ts=2022-11-16T12:57:19.037798173Z caller=frontend_processor.go:69 msg=”error processing requests” address=10.34.0.76:9095 err=”rpc error: code = Unknown desc = context canceled”
level=error ts=2022-11-16T12:57:19.037829129Z caller=frontend_processor.go:69 msg=”error processing requests” address=10.34.0.76:9095 err=”rpc error: code = Unknown desc = context canceled”
level=error ts=2022-11-16T12:57:19.037863643Z caller=frontend_processor.go:69 msg=”error pro[……]

READ MORE

「Grafana Loki」- Alerting and Recording Rules

参考文献
Alerting and Recording Rules | Grafana Loki documentation[……]

READ MORE

「Grafana Loki/Client」- Promtail

问题描述
该笔记将记录:与 Promtail 有关的内容、使用方法、以及相关问题的解决办法;
解决方案
Promtail,其为日志采集工具,其将采集分散在各个环境中的日志,并发送到集中的日志存储服务 Grafana Loki 中;
概念术语
Configuration
配置文件(promtail.yaml)的配置参数,以及相关说明;
Pipelines
从 抓取日志 到 发送到日志存储服务,总共分为四步: 1)Parsing stages parse the current log line and extract data out of it. The extracted data is then available for use by other stages. 2)Transform stages transform extracted data from previous stages. 3)Action stages take extracted data from previous stages and do something with them. Actions can: 4)Filtering stages optionally apply a subset of stages or drop entries based on some condition.
Scraping
从日志源(诸如 File、systemd journal、Windows Envent、Syslog 等等 )中抓取日志的方法;
Stages
各种 Stages 的使用方法;
Troubleshooting
运行 prometail 命令,能够针对 scrape_configs 配置进行调试,观察其行为

cat my.log | promtail –stdin –dry-run –inspect –client.url http://127.0.0.1:3100/loki/api/v1/push

cat my.log | promtail –config.file promtail.yaml

但是 clients.external_labels 似乎无法通过该方式进行显示,或许是 promtail 2.5.0 暂时不支持;
Cloud setup GCP Logs
官方文档的该部分内容与 GCP 相关,所以并非我们关注的重点,所以我们将忽略该部分;
参考文献
Troubleshooting | Grafana Loki documentation[……]

READ MORE

「Grafana Loki / Promtail」- 安装部署

解决方案
我们通过 Helm 进行 Promtail 安装部署;

helm repo add grafana https://grafana.github.io/helm-charts
helm pull grafana/promtail # promtail-5.0.0.tgz

helm show values ./promtail-5.0.0.tgz > promtail-5.0.0.helm-values.yaml
vim promtail-5.0.0.helm-values.yaml
…(0)config.clients:http://loki-loki-distributed-gateway.loki.svc.cluster.local/loki/api/v1/push
…(1)config.clients:添加 Basic Auth 认证;
…(2)config.clients:通过 external_labels 字段,来添加集群标签,以区分日志来源;

# helm –namespace=observing-client –create-namespace \
upgrade –install promtail \
./promtail-5.0.0.tgz -f promtail-5.0.0.helm-values.yaml[……]

READ MORE

「PROMTAIL」- 维护配置

positions.yaml
Grafana Loki documentation/Configuration/positions Positions stored in host path volume · Issue #416 · grafana/loki · GitHub
promtail 不断抓取日志文件,并将已抓取的位置记录在 positions.yaml 中。
通过 Helm 部署,该文件通过 hostPath 得以持久化(/run/promtail/)。如果节点重启,该文件将丢失(鉴于某些日志在重启后将丢失,所以这也是合理的)。[……]

READ MORE

「Promtail」- 常见问题处理

场景:处理多行日志(Java)
febbweiss/java-log-generator – Docker Image | Docker Hub grafana – Promtail error pipeline stage must only contain one key – Stack Overflow promtail multiline Code Example
第一步、更新 Promtail 配置:


– job_name: kubernetes-pods
pipeline_stages:
– cri: {}
# 通过 firstline 匹配多行日志开始
– multiline:
firstline: ^(\d{2})-(\d{2})-(\d{4}) (\d{2}):(\d{2}):(\d{2})
max_lines: 128
max_wait_time: 3s

第二步、创建能够产生多行日志的容器,以用于测试:kubectl apply -f ./promtail-testing.yaml
第三步、最后,在 Grafan 中,观察 Java 日志是否被合并为单条日志记录;
Q:那么多日志,如果下一行是未匹配 firstline 的常规日志会怎样(两行日志具有不同格式)? A:我们实在查看日志平台时产生的该疑问。实质上,同个日志文件,它的日志行是相同格式,如果下一行不匹配这种模式,则为视为多行日志。如果一个日志文件中具有多种日志格式行,则需要修改软件的设计,保持相同的日志格式;[……]

READ MORE

「Promtail」- 爬取 Linux Kernel 日志

解决方案
在 Linux 中,内核日志的保存路径并不相同: 1)在 Ubuntu 中,/var/log/kern.log
values.yaml(form Helm Chart)

// —————————————————————————- // 挂载日志文件

defaultVolumes:
– name: var-log
hostPath:
path: /var/log/

defaultVolumeMounts:
– name: var-log
mountPath: /var/log/
readOnly: true

// —————————————————————————- // 读取日志文件

config:
snippets:
extraScrapeConfigs: |
– job_name: linux-kernel
static_configs:
– targets:
– localhost
labels:
__path__: /var/log/kern.log
log_category: linux-kernel
hostname: ${HOSTNAME}

// —————————————————————————- // 解析配置文件中的环境变量

extraArgs:
– -config.expand-env

// —————————————————————————- // 授予日志文件访问权限

containerSecurityContext:
capabilities:
add:
– DAC_READ_SEARCH

关于 HOSTNAME 变量:Helm Chart 默认修改 HOSTNAME 变量,使其为 nodeName 值,所以该变量不会成为容器名;
关于 DAC_READ_SEARCH 参数:The CAP_DAC_OVERRIDE capability allows the root user to bypass kernel permissio[……]

READ MORE

「PROMTAIL」- 抓取 syslog 内容

问题描述
该笔记将记录:配置 Promtail 抓取 syslog 的方法,以及相关问题的解决办法;
解决方案
scrape_configs.syslog
Promtail,其提供 syslog 配置,但是其并不能直接抓取 syslog 日志,而是将 Promtail 作为 Listener,然后配置 rsyslog 将日志发送给 Promtail 服务;
我们希望减少对底层操作系统的变更(运维工作),所以并未采用该方案;
scrape_configs.static_configs
我们直接使用 static_configs 来抓取日志文件:我们的操作系统以 Ubuntu 为主;并且以云原生容器环境来运行;[……]

READ MORE

「Grafana Loki / Promtail」- 抓取 systemd journal 日志

问题描述
该笔记将记录:如何通过 Promtail 抓取 systemd journal 日志,以及相关问题的解决办法。
解决方案
补充说明:我们通过 Helm 部署 Promtail 实例,所以如下配置内容与 Helm Chart 具有相关性(但其他部署方式的配置思路也是相似的)
第一步、修改 Promtail 配置
挂载系统日志目录
修改 Helm Chart values.yaml 文件:


extraVolumes:
– name: journal
hostPath:
path: /var/log/journal

extraVolumeMounts:
– name: journal
mountPath: /var/log/journal
readOnly: true

配置日志文件抓取

extraScrapeConfigs: |

– job_name: systemd-journal
journal:
labels:
job: systemd-journal
path: /var/log/journal
max_age: 12h
relabel_configs:
– source_labels:
– __journal__systemd_unit
target_label: systemd_unit
– source_labels:
– __journal__hostname
target_label: hostname
– source_labels:
– __journal_syslog_identifier
target_label: syslog_identifier

第二步、增加 Dashboard 配置
我们没有找到满足需求的 Dashboard 配置,所以我们创建简单的 Dashboard 配置:
Variable: 1)loki_datasource: 2)hostname: label_values(hostname) 3)systemd_unit: label_values({hostname=~”$hostname”}, systemd_unit) 4)search: Text box
Pannel 1)Log browser: {hostname=”$hostname”,systemd_unit=”$systemd_unit”} |~ “(?i)$search”
参考文献
Grafana L[……]

READ MORE

「Grafana / Loki / Promtail」- 常见问题处理

节点日志无法被抓取
问题描述: 某个节点的容器日志无法被正常抓取;
环境信息: Kubernetes v1.22.15, Promtail 5.0.0, Loki 2.5.0, Grafana 8.5.3
原因分析: Bug: Promtail log is reporting error for non-existent symlink · Issue #2513 · grafana/loki promtail logs no such file or directory · Issue #429 · grafana/loki
解决方案: 重启该节点的 Promtail 服务;
… HTTP status 429 Too Many Requests …
how can I increase the maximum active stream limit? · Issue #3335 · grafana/loki · GitHub
问题描述:

level=warn ts=2022-11-10T05:10:49.533015596Z caller=client.go:349 component=client
host=loki-loki-distributed-gateway.loki.svc.cluster.local msg=”error sending batch, will retry”
status=429 error=”server returned HTTP status 429 Too Many Requests (429): Maximum
active stream limit exceeded, reduce the number of active streams (reduce labels or
reduce label values), or contact your Loki administrator to see if the limit can be increased”

解决方案: 修改 limits_config.max_streams_per_user: 0 配置;[……]

READ MORE

「Grafana Loki」- 处理重复日志

问题描述
在 Grafana Loki 中,我们发现重复日志,这些日志具有相同的时间戳。
解决方案
出现重复日志的原因由很多,这里将讨论我们遇到的问题。
场景:应用程序写入内容相同的日志
Loki logs panel deduplication · Issue #22498 · grafana/grafana · GitHub
原因分析
在短时间内,应用程序写入大量内容相同的日志。仔细观察,日志时间戳的毫秒位是不同的。
解决方案
我们在 Grafana 的 Panel 中,开启 Deduplication: Exact 选项,对日志进行去重。
Exact,根据 De-duplication of successive lines that are identical, ignoring ISO datetimes. 描述,将忽略前缀 ISO 时间的不同。
场景:… Maximum active stream limit exceeded …
how can I increase the maximum active stream limit? · Issue #3335 · grafana/loki · GitHub
在 Promtail Log 中,我们看到类似如下内容:

level=warn ts=2022-11-10T05:10:49.533015596Z caller=client.go:349 component=client
host=loki-loki-distributed-gateway.loki.svc.cluster.local msg=”error sending batch, will retry”
status=429 error=”server returned HTTP status 429 Too Many Requests (429): Maximum
active stream limit exceeded, reduce the number of active streams (reduce labels or
reduce label values), or contact your Loki administrator to see if the limit can be increased”

我们猜测是重试导致日志重复,但是我们并不能十分确定。
针对 … Maximum active stream limit exceeded … 信息,我们尝试修改 limits_config.max_streams_per_user: 0 配置,后面再做进一步观察。
场景[……]

READ MORE

「Alertmanager」- Prometheus 的告警发送工具

问题描述
我们将学习 Alertmanager 的使用方法,并整理学习笔记,学习资料以官方文档为主,辅以其他网络资料。
该笔记将记录:Alertmanager 的使用方法,其主要内容是对官方文档的学习、记录、整理,还包含部分常用配置示例。
解决方案
针对该部分内容,其均来自于官方文档,但仅提取出我们需要关注的内容,能让我们形成对 Alertmanger 的整体认识。 子章节将记录如何使用 Alertmanager 完成具体的工作任务,比如 配置 Slack 告警、定制告警消息格式。
ALERTING — Alerting overview: Concepts and Fundamentals — Alertmanager: Concepts and Fundamentals — Configuration: Maintenance, Administration — Clients: ALERTING.Clients — Notification template reference: Notification Template — Notification template examples: Notification Template — Management API: Maintenance, Administration — HTTPS and authentication: Maintenance, Administration
相关链接
Awesome Prometheus alerts | Collection of alerting rules
参考文献
How to check your prometheus.yml is valid – Robust Perception | Prometheus Monitoring Experts How do I configure the log level of Prometheus’ Alertmanager? – Server Fault alertmanager/simple.yml at master · prometheus/alertmanager What’s the difference between group_interval, group_wait, and repeat_interval? – Robust Perception | Prometheus Monitoring Experts Prometheus: understanding the delays on alerting[……]

READ MORE

「Alertmanager」- 概念术语

概念概览(=> ALERTING/Alerting overview)
Alerting overview | Prometheus
在 Prometheus 中,当指标异常而触发 Promethesu 的告警规则时,Promethesu 将请求 Alertmanager 服务,来要求 Alertmanager 发送告警信息,而 Alertmanger 负责处理这些告警消息,来决定是 是否发送消息、是否合并消息、何时发送、发送渠道等等。所以说,Alertmanager 负责管理告警消息的发送,但并不负责检查指标是否达到告警阈值(这属于 Prometheus 的任务)。
简而言之,Prometheus 负责产生告警,Alertmanager 负责进行告警信息的抑制、静默、聚合、发送;
在 Prometheus 中,配置告警的步骤如下: 1)安装并配置 Alertmanager 服务; 2)配置 Prometheus 连接 Alertmanager 服务; 3)配置 Prometheus 的 Alert Rule 来产生告警;
核心的基本概念(=> ALERTING/Alertmanager)
Alertmanager | Prometheus
消息分组(Grouping)
合并告警消息。例如,当数据中心网络故障,所有服务均不可连接,此时将产生大量告警消息。而我们仅仅希望收到一条汇总的告警消息,而不是针对每个服务的告警消息。这就是 Grouping 的作用,能够按照告警、时间、接收人来发送告警信息。对于该配置,需要在配置文件中进行设置。
Q:Alertmanager 依据什么参数来合并告警? A:Alertmanger 通过 Label 来识别是否为同个告警,如果 Label 相同,则表示为同个告警,则进行相关去重等动作。Annotaion 则是作为描述信息,不用来区分告警。 R:Prometheus/Clients
消息抑制(Inhibition)
例如,如果集群无法访问,那么我们希望抑制与这个集群相关的告警信息。这就是 Inhibition 的作用,根据关系而仅发送最关键的告警。对于该配置,需要在配置文件中进行设置。
条件判断(Silences)
允许我们根据告警消息的条件、标签来过滤告警消息,以决定某些告警是否发送。对于该配置,需要在 Alertmanager 的 Web 界面中完成。
灵活请求(Client Behavior)
除了配合 Promethesu 来发送告警消息,还能够单独使用 Alertmanager 服务。我们能够发送自定义 HTTP 请求并附带某些信息,来要求 Alertmanager 发送告警。
高可用性(High Av[……]

READ MORE

「Alertmanager」- 安装部署

关于安装方法
参考 alertmanager/README.md at master 页面。如果希望以容器运行,参考 prom/alertmanager 页面。
on Kubernetes with Helm
How do I configure the log level of Prometheus’ Alertmanager? – Server Fault
我们通过 Helm 部署 Alertmanager 组件:

# helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# helm pull alertmanager-0.19.0.tgz # CHART 0.19.0, APP v0.23.0
# helm show values alertmanager-0.19.0.tgz > alertmanager-0.19.0.helm-values.yaml

# vim alertmanager-0.19.0.helm-values.yaml

# helm –namespace observing-system \
install alertmanager ./alertmanager-0.19.0.tgz \
-f alertmanager-0.19.0.helm-values.yaml \
–create-namespace


1. Get the application URL by running these commands:
export POD_NAME=$(kubectl get pods –namespace observing-system -l “app.kubernetes.io/name=alertmanager,app.kubernetes.io/instance=alertmanager” -o jsonpath=”{.items[0].metadata.name}”)
echo “Visit http://127.0.0.1:9093 to use your application”
kubectl –namespace observing-system port-forward $POD_NAME[……]

READ MORE

「Alertmanager」- 服务管理、服务维护

配置参数及配置文件(=> ALERTING/Configuration)
Configuration | Prometheus
能够通过 命令行 和 配置文件 指定运行参数。命令行仅能简单配置,而配置文件能够定义继承规则、通知路由、告警接收人等等复杂设置;
visual editor,用于构建路由树;
SIGHUP,http:///-/reload,重新加载配置;
针对配置选项的内容,这里不再展开,在具体应用场景中,我们将再进一步研读;
命令行选项
使用 alertmanager -h 查看全部命令行选项;
指定配置文件:alertmanager –config.file /path/to/alertmanager.yml
增加日志等级:alertmanager –log.level=debug
配置文件结构与语法
我们这里侧重学习配置文件的结构,而不是每个属性及字段的含义。当对配置文件的结构形成整体的认识,在解决具体问题时也会非常清楚该如何解决;
关于官方文档的阅读: 1)[],表示该参数是可选择 2)占位符(Placeholder),即每个字段的结构及取值类型,是文档的主要内容并且需要我们了解其使用方法;
配置文件采用 YAML 格式。官方提供的示例配置文件:alertmanager/simple.yml at master · prometheus/alertmanager
根据我们学习,我们整理出如下示例配置文件:

# 定义全局配置,还定义某些参数
global:
resolve_timeout: 5m
# 邮箱相关信息
smtp_smarthost: ‘smtp.example.com’
smtp_auth_username: ‘username’
smtp_auth_password: ‘password’
smtp_from: ‘k4nz@example.com’

# 在发送通知时,使用的模板文件的路径
templates:
– ‘/etc/alertmanager/template/*.tmpl’

# 定义消息的方式渠道及相关参数
# 注意,receivers 仅定义告警消息的接收方式,而发送规则需要通过 route 定义
receivers:
# 告警到 Slack 平台
– name: ‘slack-notifications’
slack_configs:
– channel: ‘#alerts’
text: ‘https://internal.example.com/wiki/alerts/{{ .GroupLabels.app }}[……]

READ MORE

「Alertmanager」- 告警模板

定制通知模板
Notification template reference | Prometheus Notification template examples | Prometheus
Alertmanager 发送的告警消息将通过模板(Go templating)进行渲染,然后再将其发送给接受人。
鉴于介绍 Go templating 的使用方法会偏离主题,所以该笔记不会记录 Go templating 的使用方法,与其相关内容参考 Go templating 笔记。
模板大部分是开箱即用的,通常无需定制。如果希望定制模板,需要学习以下内容: 1)学习 Go templating 使用; 2)学习 Notification template reference 文档,以了解能在模板中使用的变量;
模板配置案例
官方 Notification template examples 文档,提供简单的配置示例,涵盖几个常用场景,足够我们学习入门。
这里我们将记录我们的使用场景,及相关配置: 1)发送告警消息到多个渠道,比如 Email、Slack 等等。[……]

READ MORE

「Alertmanager」- 常见问题处理

与 Alertmanager 配套的工具,具有如下功能: 1)检查配置文件是否正确:amtool check-config alertmanager.yml 2)查看当前触发的告警、并且能对这些告警进行相关操作;
Routing tree editor
测试 route 配置(类似 Routing tree editor 工具,但为命令行使用)
官方提供的 route 编辑器(Routing tree editor),能够用来测试消息的路由:根据 route 配置,以及当在告警信息中存在某些 Lable 时,哪些 receiver 将接收到消息。
告警通知渠道
PrometheusAlert
feiyu563/PrometheusAlert: Prometheus Alert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus,Zabbix,日志系统Graylog和数据可视化系统Grafana发出的预警消息,支持钉钉,微信,华为云短信,腾讯云短信,腾讯云电话,阿里云短信,阿里云电话等
飞书告警:需要借助 PrometheusAlert 服务来实现
告警企业微信
Alertmanager 原生支持告警到企业微信,参照官方文档配置即可; 但是,鉴于企业微信要求配置 IP-ADDR 信任,所以调用方需要固定网络地址,否则告警接口调用将失败;[……]

READ MORE

「Alertmanager」- 发送测试通知(=> ALERTING/Clients)

问题描述
当进行 Alertmanager 设置之后,我们希望能够发送告警消息进行测试,以验证配置已生效。但是我们又不能直接关闭服务等待 Prometheus 触发告警消息 :-)
解决方案
好在 Alertmanager 提供告警接口,允许我们以 HTTP 协议进行调用,来要求其发送告警信息。 当 Alertmanager 启动后,将监听 HTTP 9093 端口,Prometheus 将通过 HTTP 调用该接口来发送告警消息参数。而除此之外,我们能构建自己的告警参数,来发送自定义的 HTTP 请求以产生告警消息。
补充说明: 通过调用 API 告警的方式,仅作为补充手段,如果需要进行 Prometheus 告警,官方建议通过 Alert Rule 实现,不建议实现额外的客户端。
更多内容,参考 Clients | Prometheus 文档
告警脚本:send-alerts.sh
该部分将演示,在 Shell 中,调用 Alertmanager 服务来发送通知的方法,以及相关问题的处理方法。
下面是发送告警的简单示例:

#!/usr/bin/env bash

alerts_message='[
{
“labels”: {
“alertname”: “DiskRunningFull”,
“dev”: “sda1”,
“instance”: “example1”,
“msgtype”: “testing”
},
“annotations”: {
“info”: “The disk sda1 is running full”,
“summary”: “please check the instance example1”
}
},
{
“labels”: {
“alertname”: “DiskRunningFull”,
“dev”: “sda2”,
“instance”: “example1”,
“msgtype”: “testing”
},
“annotations”: {
“info”: “The disk sda2 is running full”,
“summary”: “please check the instance example1”,
“runbook”: “the following link http://test-url should be clickable”
}
}
]’

c[……]

READ MORE

「Alertmanager」- 告警到 Slack 频道

问题描述
该笔记将记录:在 Alertmanager 中,如何将告警消息发送到 Slack 频道,以及相关问题的处理方法。
解决方案
第一步、配置 Alertmanager 告警到 Slack 频道
该步骤将创建 Slack 应用,目的是为了获取 Webhook 以在 Alertmanager 中使用。
参考 Sending messages using Incoming Webhooks 文档,我们这里将简单记录过程。
1)创建 Slack 应用:https://api.slack.com/apps/new

App Name: AlertBot
Development Slack Workspace: Your Workspace
创建之后,会自动重定向到应用设置页面;
2)进入 Incoming Webhooks 页面

Activate Incoming Webhooks: On
然后,页面会显示新的内容
3)点击 Add New Webhook to Workspace 按钮,以创建新的 Webhook 地址

根据提示填写相关信息
点击 Allow 按钮,此时新的 Webhook 创建成功。
4)创建成功之后,页面会显示 curl 测试命令:

curl -X POST -H ‘Content-type: application/json’ –data ‘{“text”:”Hello, World!”}’ \
https://hooks.slack.com/services/xxxxxxxxxx

访问 https://api.slack.com/apps 地址,以查看所有应用,点击应用名以进入特定应用设置页面。
第二步、配置 Alertmanager 使用 Webhook 地址
修改 alertmanager.yml 文件 receivers 配置,并在 route 中引用:


receivers:
# slack
– name: ‘slack-channel’
slack_configs:
– api_url: ‘https://hooks.slack.com/services/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’
channel: ‘#devops-monitoring’

route:
receiver: ‘slack-channel’

第三步、定制告警模板
参考 Notification templat[……]

READ MORE

「Alertmanager」- 将告警信息发往多个渠道(Slack, Email, …)

问题描述
在出现告警时,我们希望立即收到告警消息,而不希望出现过多的延迟。这点邮件告警是无法满足的,因为邮件通知是由客户端定期查找邮箱才触发的,而且部分邮件服务器也不一定支持 IDLE 命令,因此使用邮件告警无法保证消息的即时性。此外单一的告警渠道无法满足容错的要求,比如邮箱服务出现问题,我们将错过或无法收到告警信息。
鉴于此,除了使用邮件告警,我们还需要接入 IM 进行告警通知。这便涉及将告警信息发送到多个通知渠道。
该笔记将记录:在 Alertmanager 中,将告警消息发送到多个告警渠道的方法,以及注意事项、常见问题的处理。
解决方案
方法一、通过 receiver 配置
在 receiver 中,单个条目能够包含多个告警渠道的配置:

receivers:
– name: slack_and_email
# Slack
slack_configs:
– api_url: ‘<THE_WEBHOOK_URL>’
channel: ‘#general’
– api_url: ‘<ANOTHER_WEBHOOK_URL>’
channel: ‘#alerts’
# Email
email_configs:
– to: ‘k4nz@example.com’

route:
receiver: slack_and_email

方法二、通过 route continue 参数

# 首先,我们定义多个不同的 receiver 信息
receivers:
– name: slack
slack_configs:
– api_url: THE_WEBHOOK_URL
channel: ‘#general’
– name: email
email_configs:
– to: ‘k4nz@example.com’

# 然后,在 route 中通过 continue 参数,是告警消息进行多个匹配
route:
receiver: slack # Fallback,必须设置 receiver 字段
routes:
– match:
severity: page
receiver: slack
continue: true
– match:
severity: page
receiver: pagerduty

通常告警消息的 Lable 匹配 match 之后,不会继续向下匹配。通过 continue: true 能够[……]

READ MORE

「Prometheus」- Exporters

Exports
Exporters and integrations | Prometheus
Export 负责从应用程序中抓取数据,并生成监控指标,以供 Prom 完成抓取。
某些应用程序已经提供 Prom 能够抓取的指标,所以不再需要独立的 Exporter 服务。
process-exporter
ncabatoff/process-exporter: Prometheus exporter that mines /proc to report on selected processes
Writing exporters
Writing exporters | Prometheus
在这部分内容中,官方介绍编写 Export 的方法,以及最佳实践。
Client Libraries and Writing
Client libraries | Prometheus
在 Prometheus 监控服务之前,需要通过 Client-Lib 能够将检测添加到代码中。简单说,通过 Client-Lib 并结合应用程序,使得我们能够快速生成 Prom 需要的指标类型;
官方 Writing client libraries 文档,其介绍编写 Client-Lib 的方法,目前已经有使用语言的客户端库,该文档旨在帮助新客户库的作者制作出好的库。
推送指标
Pushing metrics | Prometheus
Pushgateway 相关内容。
某些程序执行时间较短,在 Prom 抓取前可能已经退出,导致无法进一步抓取。
所以,通过 Push Gateway 特性,应用程序主动将数据推送到 Push Gateway 进而送入 Prom 服务中。
Exposition formats
Exposition formats | Prometheus
部分语言没有对应的 Client-Lib,所以官方在 Exposition formats 中描述 Target 暴露出的数据格式。所以,即使没有 Client-Lib,我们按照规范格式返回数据即可。

章节列表
「PROMETHEUS」- kubelet cAdvisor 「Prometheus」- 编写 Exporter 服务(Python) 「PROMETHEUS」- Process Exporter 「PROMETHEUS」- Node Exporter[……]

READ MORE

「Prometheus」- 编写 Exporter 服务(Python)

问题描述
我们需要为自己的应用编写 Prometheus Exporter 服务,以允许 Prometheus 抓取监控指标。
该笔记将记录:使用 Python 语言编写 Prometheus Exporter 服务的方法,以及常见问题处理。
解决方案
第一步、创建虚拟环境

mkvirtualenv prometheus-client
workon prometheus-client
pip install –upgrade pip

pip install prometheus-client

第二步、创建 Exporter 服务

# example.py

from prometheus_client import start_http_server, Summary
import random
import time

# Create a metric to track time spent and requests made.
REQUEST_TIME = Summary(‘request_processing_seconds’, ‘Time spent processing request’)

# Decorate function with metric.
@REQUEST_TIME.time()
def process_request(t):
“””A dummy function that takes some time.”””
time.sleep(t)

if __name__ == ‘__main__’:
# Start up the server to expose the metrics.
start_http_server(8000)
# Generate some requests.
while True:
process_request(random.random())

第三步、运行并访问该 Exporter 服务

# python example.py

# curl http://localhost:8000/

process_max_fds 1024.0
# HELP request_processing_seconds Time spent processing request
# TYPE request_processing_seconds summary
request_processing_seconds_count 0.0
request_processing_seconds_sum 0.0
# HELP request_processing_seco[……]

READ MORE

「PROMETHEUS」- Node Exporter

服务部署
部署 Node Exporter 服务

# helm pull prometheus-community/prometheus-node-exporter –version 4.3.0

# helm show value ./prometheus-node-exporter-4.3.0.tgz > prometheus-node-exporter-4.3.0.helm-values.yaml
# vim prometheus-node-exporter-4.3.0.helm-values.yaml

# helm install -n observing-client mon-node-exporter \
./prometheus-node-exporter-4.3.0.tgz -f prometheus-node-exporter-4.3.0.helm-values.yaml

配置 Prometheus 抓取
Configuration | Prometheus How to configure prometheus kubernetes_sd_configs to specify a specific host port?
prometheus-community https://prometheus-community.github.io/helm-charts prometheus-community/prometheus


extraScrapeConfigs: |

– job_name: ‘node-exporter’
kubernetes_sd_configs:
– role: node
relabel_configs:
– source_labels: [__address__]
action: replace
regex: ([^:]+):.*
replacement: $1:9100
target_label: __address__

配置 Grafana 展示
Grafana Labs/Dashboards/Node Exporter Full
指标数据
Block Device and File System
Mapping iostat to the node exporter’s node_disk_* metrics
IOPS, iostat (r/s) => rate(node_disk_reads_completed_total[5m]) IOPS, iostat (w/s)[……]

READ MORE

「PROMETHEUS」- Process Exporter

服务部署
mumoshu/prometheus-process-exporter
部署 Process Exporter 服务

# git clone https://github.com/mumoshu/prometheus-process-exporter.git

# helm show values ./prometheus-process-exporter/charts/prometheus-process-exporter/ \
> prometheus-process-exporter.helm-values.yaml

# vim prometheus-process-exporter.helm-values.yaml

groups:
– comm:
– etcd

# helm upgrade –install \
-n observing-client mon-process-exporter \
./prometheus-process-exporter/charts/prometheus-process-exporter/ \
-f prometheus-process-exporter.helm-values.yaml

添加 Prometheus Scrape 配置

– job_name: ‘process-exporter’
kubernetes_sd_configs:
– role: endpoints
relabel_configs:
– source_labels: [__address__]
action: replace
regex: ([^:]+):.*
replacement: $1:9100
target_label: __address__
– source_labels: [__meta_kubernetes_pod_node_name]
action: replace
target_label: instance

创建 Grafana Dashbaord 显示
process exporter dashboard with treemap | Grafana Labs Named processes | Grafana Labs[……]

READ MORE

「Thanos」- 实现 Prometheus 长期存储功

问题描述
Prometheus,监控数据默认写入本地磁盘,这将限制 Prometheus 的监控数据存储能力,同时数据备份、存储空间扩展都将收到限制。
解决方案
Thanos,提供 全局查询视图、高可用性、数据备份、历史、廉价数据访问 功能,作为 Prometheus 的后端存储。
原理简述
通过 Prometheus 的 Remote Read / Remote Write 特性,Promtheus 将数据写入 Thanos 中,也能从 Thanos 中读取数据。[……]

READ MORE

「Kubernetes」- 部署 Thanos 服务

问题描述
该笔记将记录:通过 Bitnami 提供的 Thanos Helm Chart 来部署 Thanos 服务的方法,以及相关问题的解决办法。
解决方案

helm repo pull bitnami/thanos

helm show values ./thanos-12.0.0.tgz > thanos-12.0.0.helm-values.yaml
vim thanos-12.0.0.helm-values.yaml
…(1)开启 receive、store-gateway 组件;
…(2)配置使用 S3 对象存储;

helm upgrade -n observing-system –install mon-thanos \
./thanos-12.0.0.tgz -f thanos-12.0.0.helm-values.yaml

补充说明
配置写入对象存储:


objstoreConfig: |
type: S3
config:
bucket: “infra-mon-prometheus”
endpoint: “stge.platform.d3rm.org:9000”
region: “”
access_key: “9r9elpyKi2mfzoGI”
insecure: true
signature_version2: false
secret_key: “Gv25TS7u5eCXnIjgVvaopl5ceITCnglI”
http_config:
idle_conn_timeout: 0s
insecure_skip_verify: true

修改 Prometheus 配置(Remote Write):

remoteWrite:
– url: http://mon-thanos-receive:19291/api/v1/receive

参考文献
Thanos/Storage/S3 thanos/quick-tutorial.md at main · thanos-io/thanos[……]

READ MORE

「Elastic Stack」- 关于订阅

问题描述
官方提供多种订阅计划,同时也开放了 X-PACK 的部分功能。那么我们需要清楚的问题就是: 1)免费版本具有哪些功能? 2)我们可以使用 X-PACK 的哪些功能?
对于这个问题,可以参考 Elastic Stack subscriptions 页面,无需阅读本笔记其他内容。
什么是订阅计划?
官方提供了几种灵活的订阅计划,用户可以更具自己的需要进行选择。所谓「订阅计划」就是普通版、会员版、黄金版啥的这一套。
本文将简单的介绍这些订阅计划,以及其中包含的功能(重点)。
订阅计划的种类
08/12/2019
目前只有 Open Source、Basic、Gold、Platinum 这四种订阅计划。
前两种订阅计划是免费的,可以免费下载的,而且 Basic 是默认的。
可以使用 GET /_xpack/license 查看许可状态。
06/01/2020
https://www.elastic.co/elasticsearch/service/pricing Standard Gold Gold Enterprise => 全部是付费版本
https://www.elastic.co/subscriptions OPEN SOURCE => 免费版本,但是不包含以下功能(这里只列举我们感兴趣的功能,其他描述请参考上面的链接): 1)Index lifecycle management
订阅计划的功能列表
每种订阅计划都包含不同的功能,参考 Elastic Stack subscriptions 页面
关于 X-Pack 扩展
08/12/2019
另外,目前 X-Pack 已经开放了某些功能,在 Elastic Stack subscriptions 中也可以看到某些功能是否开放。
在 Elasticsearch 6.3 中,已经默认安装 X-Pack 包,所以无需单独安装,使用 GET _xpack 可以查看相关信息。
默认的Elasticsearch分发包括X-Pack的所有功能,但默认是“Basic”许可证。可以在Kibana (Management -> License)开启某些新特性的试用。
关于 Elasticsearch OSS 版本
而实际上并没有 Elassticsearch OSS 版本,参考 We opened X-Pack 文章。
参考文献
Elastic Stack subscriptions Elasticsearch Reference [6.3] » X-Pack APIs » Info API Kibana User Guide [6.3] » Ma[……]

READ MORE

「Elasticsearch」- 基本概念(学习笔记)

建议参考官方 Elasticsearch Reference [7.7] » Glossary of terms 文档。
索引(Index)
是具有某些类似特征的文档集合。例如,客户数据索引、产品目录索引、订单数据索引 等等。在单个群集中,可以根据需要定义任意数量的索引。
索引由名称进行标识(必须全部小写),此名称用于引用索引,以在对其中的文档执行索引、搜索、更新、删除操作。
分片(Shard)
Elasticsearch 可以把完整的 Index 切割分成多个“块”,“块”被称之为 Shard。因此在 Elasticsearch 中,Index 只是逻辑概念,而内部存储则是分割后的 Index —— Shard。
这样的好处有以下几点: 1)切割成多个 Shard 可以分布到不同节点,容易水平扩展集群,而不是增加单机硬件; 2)可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索,提高性能。
分片的数量只能在索引创建前指定,并且索引创建后不能更改。
副本(Replica)
索引副本,是索引的副本。在 Elasticsearch 中可以设置多个索引的副本,副本的作用:一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复;二是提高ES的查询效率,ES会自动对搜索请求进行负载均衡。
Primary Shards / Replica Shards
Primary Shards:原始分片 Replica Shards:副本分片,复制原始分片而得到的分片
默认情况下,在 Elasticsearch 6.5 中的每一个索引都分配了 5 个索引分片和 1 个索引副本,这意味着:如果群集中至少有两个节点,则一个索引将包含 5 个主索引分片和另外 5 个副本分片(一个完整的索引副本),总计为每个索引有 10 个索引分片。
集群(Cluster)
集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。ES的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看ES集群,在逻辑上是个整体,你与任何一个节点的通信和与整个ES集群通信是等价的。
节点(node)
Elasticsearch Reference [7.6] » Modules » Node 节点,是作为群集一部分的单个服务器,存储数据并参与群集的索引和搜索功能。就像集群一样,节点由名称进行标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不需要默认值,可以定义所需的任何节点名称。此名称对于管理目的非常重要,可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些[……]

READ MORE