使用 prometheus 优化 WireGuard 监控与可视化

最近心血来潮把wireguard的监控搬到 prometheus 上来,在 Grafana 中动态展示 WireGuard 网络的健康状态,如果某条断联了,由prometheus进行告警,于是便有了这篇文章。

1. WireGuard Exporter 安装

参考:MindFlavor/prometheus_wireguard_exporter,为每一个节点安装exporter:

version: '2.4'

services:
  wgexporter:
    image: mindflavor/prometheus-wireguard-exporter
    network_mode: host
    container_name: wg-exporter
    cap_add:
      - NET_ADMIN
    privileged: true
    command: ["--prepend_sudo", "true"]
    environment:
      - PROMETHEUS_WIREGUARD_EXPORTER_VERBOSE_ENABLED=true
      - PROMETHEUS_WIREGUARD_EXPORTER_PORT=12386
    restart: always

相关的配置参考github即可。我是用了两个配置:

  • PROMETHEUS_WIREGUARD_EXPORTER_VERBOSE_ENABLED,详细模式
  • PROMETHEUS_WIREGUARD_EXPORTER_PORT,自定义端口

2. Prometheus 采集 WireGuard 状态

在 Prometheus 的配置文件 prometheus.yml 中添加 scrape_configs 来收集 WireGuard 的指标:

scrape_configs:
  - job_name: 'wireguard_exporter'
    static_configs:
      - targets:
          - 'wg-exporter.nanjing1.local:12386'
          - 'wg-exporter.chengdu2.local:12386'
    relabel_configs:
      - source_labels: [__address__]
        regex: 'wg-exporter\.([^.]+)\..*'
        target_label: src_peer
    metric_relabel_configs:
       - source_labels: [allowed_ips]
         regex: .*100\.100\.100\.100/32.*
         action: replace
         target_label: target_peer
         replacement: OnePlus

此配置帮助我从每个节点的 instance 中提取出 nanjing1 或 chengdu2 作为新的 src_peer 标签,从结果中将 100.100.100.100 的节点标记为OnePlus节点,增加可读性。

这里涉及到了 relabel_configsmetric_relabel_configs 两个配置项,能够帮助我们灵活地重命名、修改、删除或过滤标签以及指标。常用于数据抓取(scrape_configs)和指标数据的处理(metric_relabel_configs)

  • relabel_configs:当我们要修改或过滤抓取目标时使用。例如,改变目标实例的名称,或选择性地抓取某些目标。
    • source_labels:一个标签列表,Prometheus 会从这些标签中提取信息进行后续处理。它的内容可以是任何来自目标的标签。
    • target_label:表示你希望修改或创建的目标标签的名称。如果你想修改现有的标签值,指定该标签的名称即可。如果你想添加新的标签,则可以指定新的标签名称。
    • regex:一个正则表达式,用来匹配标签的值。如果正则表达式匹配成功,就可以根据 replacement 替换值或执行其他操作。
    • replacement:如果 regex 匹配成功,可以用 replacement 字符串替换标签值。如果 replacement 为一个空字符串,则会删除匹配的标签
  • metric_relabel_configs:已经抓取了指标数据,但想对这些数据进行修改或过滤时使用。例如,修改指标标签的值,重命名指标,或删除一些不需要的指标。
    • source_labels:一个标签列表,类似于 relabel_configs,它指定要修改的标签。
    • target_label:希望修改或添加的指标标签的名称。
    • regex:用于匹配标签值的正则表达式。
    • replacement:当 regex 匹配成功时,用来替换标签值或创建新的标签。
    • action:定义如何处理匹配的指标,可以是:
      • replace:替换标签值。
      • keep:保留该指标数据。
      • drop:丢弃该指标数据。

3. Grafana 可视化

  1. 可视化握手时间

    (time() - wireguard_latest_handshake_seconds{src_peer!="",target_peer!=""})
    
  2. 可视化连接速率

    irate(wireguard_sent_bytes_total{node=~"a1|b1",target_peer=~"a2|b2"}[$interval])
    

使用容器启动 Neovim 并自启动 Neovim 和 NvimTree

我上一篇文章《neovim 安装使用备忘》已经有点老了,这会儿 NvChad 已经更新到2.5了。按照之前的办法已经无法安装了。

1. 编写 Dockerfile

FROM alpine:latest

# 设置工作目录
WORKDIR /root

# 安装必要的软件包:git、nodejs、neovim 等
RUN apk add --no-cache git nodejs neovim ripgrep build-base wget && \
    git clone https://github.com/NvChad/starter ~/.config/nvim && \
    nvim --headless +PlugInstall +qall

CMD ["nvim"]
  • 自动安装插件:使用 nvim –headless +PlugInstall +qall 来在容器构建过程中自动安装 Neovim 插件。–headless 使得 Neovim 在没有 GUI 的情况下运行,而 +PlugInstall +qall 则是自动安装插件并退出 Neovim。

2. 构建镜像

docker build -t nvchad:v20241223 .

构建完成后,Docker 会生成一个镜像,可以用于后续的容器启动。

3. 使用 docker-compose

version: '3.2'

services:
  nvChad:
    image: nvchad:v20241223
    network_mode: bridge
    container_name: nvchad
    volumes:
      - /root/Workspace:/root/Workspace
    command: nvim +NvimTreeToggle
    working_dir: /root/Workspace
    tty: true
    stdin_open: true
  • command: nvim +NvimTreeToggle:每次容器启动时,nvim 会自动执行 :NvimTreeToggle,打开 NvimTree 文件树视图。

image-20241223午後64745320

image-20241223午後65009104

4. 通过 docker exec 进入容器时自动打开 Neovim

docker exec -it nvchad nvim +NvimTreeToggle

nvim +NvimTreeToggle:容器启动时,nvim 会自动执行 :NvimTreeToggle,打开 NvimTree 文件树视图。

5. 后续

push 镜像到docker.io了:

docker tag nvchad:v20241223 kelvinblood/nvchad:v20241223
docker push kelvinblood/nvchad:v20241223

6. 快速打开容器

基于步骤4,我写了一个 alias,方便在目录下快速进入容器中,它需要预设该容器的名字为 文件夹名+nvchad

dneo() {
  # 如果没有参数,获取当前文件夹名并追加 "-nvchad"
  if [ -z "$1" ]; then
    local folder_name=$(basename "$PWD")
    local container_name="${folder_name}-nvchad"
    docker exec -it "$container_name" nvim +NvimTreeToggle
  else
    docker exec -it "$1" nvim +NvimTreeToggle
  fi
}

例如我在文件夹 workspace下,此时有一个 workspace-nvchad 的容器,输入 dneo 命令即可快速进入。

7. 同步更新组件+修改落盘

image-20241224午後30929145

参考资料


Vim 禁用自动换行与粘贴模式

我的 Vim 编辑器用了很多的配置,粘贴代码时,默认的自动换行或自动缩进功能会导致内容显示异常。以下是解决方法。

启用粘贴模式

粘贴模式会临时禁用缩进与换行规则,仅适用于当前会话。

:set paste

关闭 Vim 后,新的会话会自动恢复为非粘贴模式,无需手动设置,也可以手动关闭粘贴模式:

:set nopaste

其他:禁用自动换行

这部分内容是扩展的知识,记录一下。

默认情况下,Vim 可能会开启自动换行(wrap)。可以通过以下命令禁用:

:set nowrap
:set textwidth=0
:set wrapmargin=0
:set formatoptions-=t

快捷键配置

为了更高效地切换,可以在 ~/.vimrc 中为 paste 和 nopaste 设置快捷键:

nnoremap <F2> :set paste<CR>
nnoremap <F3> :set nopaste<CR>

这样,按 F2 可以进入粘贴模式,按 F3 退出粘贴模式,方便快捷。


卸载阿里云盾(2024版)

2017年的机器,今年不续了,开了新的机器,步骤稍微有点变了记录一下。

  1. 先在阿里云云安全中心控制台禁用阿里云盾的自我保护功能,然后再进行卸载操作。

    云安全中心->资产中心->主机资产->防御状态->客户端自保护(关闭)

    不关闭的话其实文件会有 -e 的属性,就没有办法快速删除:

    lsattr /etc/systemd/system/aegis.service
    
  2. 官方卸载脚本:

     wget http://update.aegis.aliyun.com/download/uninstall.sh
     chmod +x uninstall.sh
     ./uninstall.sh
    
     wget http://update.aegis.aliyun.com/download/quartz_uninstall.sh
     chmod +x quartz_uninstall.sh
     ./quartz_uninstall.sh
    

参考资料