golang轻量级可远程配置的监控服务插件dish的使用

Golang轻量级可远程配置的监控服务插件dish的使用

dish_logo

特性

  • 轻量级:一次性监控服务
  • 远程配置:支持本地或远程配置
  • 快速:并发测试,总体执行时间短
  • 零依赖:无外部依赖

使用场景

  • HTTP、ICMP端点以及TCP套接字的轻量级健康检查
  • 在不同主机上部署独立dish实例的分布式监控,从公共API拉取配置
  • 无需长期运行代理的定时一次性检查

安装方式

使用go install

go install go.vxn.dev/dish/cmd/dish@latest

使用Homebrew

brew install dish

手动下载

从发布页面下载适合您操作系统和架构的二进制文件。

使用方法

基本命令格式:

dish [FLAGS] SOURCE

dish run示例

配置源

检查的端点列表可以通过两种方式提供:

  1. 本地JSON文件

    • 例如仓库中包含的./configs/demo_sockets.json示例文件
  2. 远程RESTful JSON API端点

    • 从该端点获取的套接字列表可以本地缓存
# 本地JSON文件
dish /opt/dish/sockets.json

# 远程JSON API源
dish http://restapi.example.com/dish/sockets/:instance

协议指定

dish会根据配置JSON确定使用哪种协议检查提供的端点:

  1. 如果host_name字段以"http://"或"https://"开头,使用HTTP
  2. 如果port_tcp字段在1到65535之间,使用TCP
  3. 如果host_name不为空,使用ICMP
  4. 以上条件均不满足,检查失败

注意:ICMP目前在Windows上不支持。

标志选项

dish -h
Usage of dish:
  -cache
        是否缓存从远程API源获取的套接字列表
  -cacheDir string
        缓存从远程API源获取的套接字列表的目录 (默认 ".cache")
  -cacheTTL uint
        缓存套接字列表的有效时间(分钟) (默认 10)
  -discordBotToken string
        Discord bot token
  -discordChannelId string
        Discord频道ID
  -hname string
        自定义附加头名称(主要用于认证)
  -hvalue string
        自定义附加头值(主要用于认证)
  -machineNotifySuccess
        是否向机器通道报告无失败的成功检查
  -name string
        dish实例名称 (默认 "generic-dish")
  -target string
        结果更新路径/URL到pushgateway,纯文本/字节输出
  -telegramBotToken string
        Telegram bot私钥
  -telegramChatID string
        Telegram聊天/频道ID
  -textNotifySuccess
        是否向文本通道报告无失败的成功检查
  -timeout uint
        http和tcp调用的超时时间(秒) (默认 10)
  -updateURL string
        推送结果的API端点URL
  -verbose
        控制台日志输出开关,除非NO_COLOR=true环境变量禁用,否则输出为彩色
  -webhookURL string
        webhook端点URL

退出代码

退出代码 含义
0 所有检查成功通过
1 未提供套接字源
2 命令行参数解析失败
3 套接字测试运行失败
4 无法访问一个或多个套接字

告警机制

当套接字测试失败时,dish提供5种不同的告警方式(可以组合使用):

  1. 测试结果上传到远程JSON API(使用-updateURL标志)
  2. 检查结果作为Telegram消息体(通过-telegramBotToken-telegramChatID标志)
  3. 失败计数和最后测试时间戳更新到Prometheus的Pushgateway(使用-target标志)
  4. 测试结果推送到webhook URL(使用-webhookURL标志)
  5. 检查结果作为Discord消息(通过-discordBotToken-discordChannelId标志)

Telegram告警示例

示例代码

基本使用示例

# 获取并安装特定版本
go install go.vxn.dev/dish/cmd/dish@latest

export PATH=$PATH:~/go/bin

# 从sockets.json文件加载套接字,并使用Telegram进行告警
dish -telegramChatID "-123456789" \
 -telegramBotToken "123:AAAbcD_ef" \
 sockets.json

# 使用远程JSON API服务作为套接字源,并将结果推送到Pushgateway
dish -target https://pushgw.example.com/ \
 https://api.example.com/dish/sockets

Docker使用示例

# 复制和/或编辑环境文件(可选)
cp .env.example .env
vi .env

# 构建Docker镜像
make build

# 使用docker compose运行
make run

# 使用原生docker run运行
docker run --rm \
 dish:1.12.0-go1.24 \
 -verbose \
 -target https://pushgateway.example.com \
 https://api.example.com

Bash脚本和Cronjob示例

创建bash脚本tiny-dish-run.sh:

#!/bin/bash

TELEGRAM_TOKEN="123:AAAbcD_ef"
TELEGRAM_CHATID="-123456789"

SOURCE_URL=https://api.example.com/dish/sockets
UPDATE_URL=https://api.example.com/dish/sockets/results
TARGET_URL=https://pushgw.example.com

DISH_TAG=dish:1.12.0-go1.24
INSTANCE_NAME=tiny-dish

API_TOKEN=AbCd

docker run --rm \
        ${DISH_TAG} \
        -name ${INSTANCE_NAME} \
        -hvalue ${API_TOKEN} \
        -hname X-Auth-Token \
        -target ${TARGET_URL} \
        -updateURL ${UPDATE_URL} \
        -telegramBotToken ${TELEGRAM_TOKEN} \
        -telegramChatID ${TELEGRAM_CHATID} \
        -timeout 15 \
        -verbose \
        ${SOURCE_URL}

设置为可执行:

chmod +x tiny-dish-run.sh

创建Cronjob定期运行:

crontab -e

添加以下内容:

# m h  dom mon dow   command
MAILTO=monitoring@example.com

*/2 * * * * /home/user/tiny-dish-run.sh

集成示例

有关使用dish与远程API集成的示例,可以参考示例状态页面。

贡献

dish是一个相对小规模的项目,无论您是初学者还是有经验的开发者,都会觉得它很有趣。我们欢迎初学者参与,如果您愿意花时间了解代码库和Go语言,我们很乐意提供反馈和指导。


更多关于golang轻量级可远程配置的监控服务插件dish的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级可远程配置的监控服务插件dish的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级监控服务插件dish使用指南

dish是一个轻量级的Golang监控服务插件,支持远程配置,非常适合需要简单监控解决方案的场景。下面我将详细介绍dish的使用方法。

安装dish

首先安装dish包:

go get github.com/zhangpeihao/dish

基本使用

1. 创建监控服务

package main

import (
	"log"
	"time"

	"github.com/zhangpeihao/dish"
)

func main() {
	// 创建监控服务
	monitor := dish.NewMonitor("my-service", "1.0.0")

	// 添加监控项
	monitor.AddMetric("cpu_usage", dish.Gauge, "CPU使用率")
	monitor.AddMetric("memory_usage", dish.Gauge, "内存使用率")
	monitor.AddMetric("request_count", dish.Counter, "请求计数")

	// 启动HTTP服务用于暴露指标和接收远程配置
	go func() {
		if err := monitor.Start(":8080"); err != nil {
			log.Fatalf("监控服务启动失败: %v", err)
		}
	}()

	// 模拟数据更新
	for {
		// 更新指标值
		monitor.SetMetricValue("cpu_usage", getCPUUsage())
		monitor.SetMetricValue("memory_usage", getMemoryUsage())
		monitor.IncMetricValue("request_count", 1)

		time.Sleep(5 * time.Second)
	}
}

// 模拟获取CPU使用率
func getCPUUsage() float64 {
	return 30.0 + float64(time.Now().Second())/2
}

// 模拟获取内存使用率
func getMemoryUsage() float64 {
	return 50.0 + float64(time.Now().Second())/3
}

2. 远程配置

dish支持通过HTTP API动态修改配置:

# 添加新指标
curl -X POST http://localhost:8080/config/metrics \
  -H "Content-Type: application/json" \
  -d '{"name":"disk_usage", "type":"gauge", "description":"磁盘使用率"}'

# 更新采样间隔
curl -X PUT http://localhost:8080/config/interval \
  -H "Content-Type: application/json" \
  -d '{"interval":10}'

3. 查看监控指标

访问 http://localhost:8080/metrics 可以查看所有监控指标,输出格式兼容Prometheus。

高级功能

自定义指标收集器

type CustomCollector struct{}

func (c *CustomCollector) Collect() (map[string]float64, error) {
	return map[string]float64{
		"custom_metric1": float64(time.Now().Unix() % 100),
		"custom_metric2": float64(time.Now().Unix() % 50),
	}, nil
}

func main() {
	monitor := dish.NewMonitor("custom-service", "1.0.0")
	
	// 注册自定义收集器
	monitor.RegisterCollector("custom", &CustomCollector{}, 10*time.Second)
	
	// ...其他代码
}

告警配置

// 设置告警规则
monitor.SetAlertRule("high_cpu", "cpu_usage", ">", 90.0, "CPU使用率过高")
monitor.SetAlertRule("low_memory", "memory_usage", "<", 10.0, "内存可用率过低")

// 设置告警处理器
monitor.SetAlertHandler(func(alert *dish.Alert) {
	log.Printf("告警: %s - 当前值: %.2f", alert.Message, alert.Value)
	// 这里可以添加邮件、短信等通知逻辑
})

配置持久化

dish支持将配置保存到文件并从文件加载:

// 保存配置到文件
err := monitor.SaveConfigToFile("monitor_config.json")
if err != nil {
	log.Printf("保存配置失败: %v", err)
}

// 从文件加载配置
err = monitor.LoadConfigFromFile("monitor_config.json")
if err != nil {
	log.Printf("加载配置失败: %v", err)
}

最佳实践

  1. 合理设置指标类型

    • Gauge:适用于上下波动的值,如CPU、内存使用率
    • Counter:适用于只增不减的值,如请求计数
  2. 监控服务命名:使用有意义的服务名称和版本号

  3. 采样频率:根据指标变化频率合理设置采样间隔

  4. 错误处理:为关键操作添加错误处理逻辑

  5. 资源限制:监控服务本身不应消耗过多资源

dish作为一个轻量级监控解决方案,非常适合中小型项目或作为大型监控系统的补充。它的远程配置功能使得运维人员可以在不重启服务的情况下调整监控策略,大大提高了灵活性。

回到顶部