golang实时应用性能监控与分析插件库MoniGO的使用

Golang实时应用性能监控与分析插件库MoniGO的使用

MoniGO简介

MoniGo是一个用于Go应用程序的性能监控库,它提供实时性能洞察和直观的用户界面,帮助开发者跟踪和优化服务级别和函数级别的性能指标。

Monigo Icon

主要特性

  • 实时监控:获取Go应用程序的最新性能指标
  • 详细洞察:跟踪和分析服务和函数级别的性能
  • 可定制仪表盘:通过易用的UI管理性能数据
  • 可视化图表:使用图表解释性能趋势
  • 自定义阈值:为应用程序的性能和资源使用配置自定义阈值

安装

安装MoniGo,使用以下命令:

go get github.com/iyashjayesh/monigo@latest

使用示例

以下是一个完整的MoniGO使用示例:

package main

import (
    "github.com/iyashjayesh/monigo"
    "log"
    "math"
)

func main() {
    // 初始化MoniGo实例
    monigoInstance := &monigo.Monigo{
        ServiceName:             "data-api", // 必填字段
        DashboardPort:           8080,       // 默认8080
        DataPointsSyncFrequency: "5s",       // 默认5分钟
        DataRetentionPeriod:     "4d",       // 默认7天。支持值:"1h", "1d", "1w", "1m"
        TimeZone:                "Local",    // 默认本地时区
        // MaxCPUUsage:             90,      // 默认95%
        // MaxMemoryUsage:          90,      // 默认95%
        // MaxGoRoutines:           100,     // 默认100
    }

    // 跟踪函数,当函数被调用时会被追踪并在仪表盘上显示指标
    monigo.TraceFunction(highCPUUsage) 

    // 启动MoniGo仪表盘
    go monigoInstance.Start() 
    log.Println("Monigo dashboard started at port 8080")

    // 可选
    // routinesStats := monigoInstance.GetGoRoutinesStats() // 获取go routines统计
    // log.Println(routinesStats)

    // 保持程序运行
    select {}
}

// highCPUUsage是模拟高CPU使用的函数
func highCPUUsage() {
    // 通过执行大量计算模拟高CPU使用
    var sum float64
    for i := 0; i < 1e8; i++ { // 1亿次迭代
        sum += math.Sqrt(float64(i))
    }
}

API示例

func apiHandler(w http.ResponseWriter, r *http.Request) {
    // 跟踪函数:当highMemoryUsage函数被调用时会被追踪
    monigo.TraceFunction(highMemoryUsage)
    w.Write([]byte("API1 response: memexpensiveFunc"))
}

func highMemoryUsage() {
    // 通过分配大切片模拟高内存使用
    largeSlice := make([]float64, 1e8) // 1亿个元素
    for i := 0; i < len(largeSlice); i++ {
        largeSlice[i] = float64(i)
    }
}

可用报告类型

  1. 负载统计:提供服务的整体负载、CPU负载、内存负载和系统负载的概览
  2. CPU统计:显示核心总数、服务使用的核心数和系统使用的核心数
  3. 内存统计:显示系统总内存、系统使用的内存、服务使用的内存、可用内存、GC暂停时间和堆栈内存使用情况
  4. 内存分析:提供有关服务堆分配、系统堆分配、服务总分配和操作系统总内存的信息
  5. 网络IO:显示发送和接收的字节数
  6. 健康指标:提供服务的整体健康百分比

API参考

MoniGo提供以下API端点:

端点 描述 方法 请求 响应 示例
/monigo/api/v1/metrics 获取所有指标 GET JSON 示例
/monigo/api/v1/go-routines-stats 获取go routines统计 GET JSON 示例
/monigo/api/v1/service-info 获取服务信息 GET JSON 示例
/monigo/api/v1/service-metrics 获取服务指标 POST JSON JSON 示例
/monigo/api/v1/reports 获取历史数据 POST JSON JSON 示例

默认情况下,仪表盘可在http://localhost:8080/访问(或您提供的端口)。

注意事项

monigo.TraceFunction(func())方法接受func(){}类型作为参数。


更多关于golang实时应用性能监控与分析插件库MoniGO的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang实时应用性能监控与分析插件库MoniGO的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


MoniGO - Golang实时应用性能监控与分析库

MoniGO是一个轻量级的Golang实时性能监控库,它可以帮助开发者收集和分析应用程序的运行指标。下面我将介绍MoniGO的基本用法和示例代码。

安装MoniGO

go get github.com/monigo/monigo

基本使用

1. 初始化监控器

package main

import (
	"github.com/monigo/monigo"
	"time"
)

func main() {
	// 初始化监控器
	monitor := monigo.NewMonitor(
		monigo.WithInterval(5 * time.Second),  // 每5秒收集一次指标
		monigo.WithMemoryProfiling(true),     // 启用内存分析
		monigo.WithCPUProfiling(true),        // 启用CPU分析
		monigo.WithGoroutineTracking(true),   // 跟踪goroutine数量
	)
	
	// 启动监控
	monitor.Start()
	defer monitor.Stop()
	
	// 你的应用代码...
}

2. 自定义指标监控

// 添加自定义指标
monitor.AddCustomMetric("requests_processed", monigo.Counter, "Total processed requests")

// 在业务代码中更新指标
func handleRequest() {
	// 处理请求的业务逻辑...
	
	// 增加计数器
	monitor.Increment("requests_processed")
}

3. 性能分析端点

MoniGO可以暴露一个HTTP端点用于实时查看性能数据:

// 添加HTTP监控端点
monitor.AddHTTPEndpoint(":8080", "/metrics")

// 然后可以通过访问 http://localhost:8080/metrics 查看实时指标

4. 告警配置

// 设置CPU使用率告警
monitor.SetAlert(monigo.AlertConfig{
	Metric:     "cpu_usage",
	Threshold:  80,  // 80%使用率
	Duration:   1 * time.Minute,
	Handler: func(alert *monigo.Alert) {
		fmt.Printf("警报! CPU使用率超过80%: %.2f%%\n", alert.Value)
		// 这里可以添加邮件/短信通知逻辑
	},
})

高级功能

1. 分布式追踪

// 启用分布式追踪
monitor.EnableTracing(
	monigo.WithJaeger("http://jaeger:14268/api/traces"),
	monigo.WithServiceName("my-service"),
)

// 创建追踪span
func processOrder(ctx context.Context) {
	span := monitor.StartSpan(ctx, "process_order")
	defer span.End()
	
	// 业务逻辑...
}

2. 自定义数据导出

// 自定义导出到Prometheus
promExporter := monigo.NewPrometheusExporter()
monitor.AddExporter(promExporter)

// 或者导出到InfluxDB
influxExporter := monigo.NewInfluxDBExporter(
	"http://influxdb:8086",
	"my_database",
	"username",
	"password",
)
monitor.AddExporter(influxExporter)

示例:完整的Web服务监控

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/monigo/monigo"
	"net/http"
	"time"
)

func main() {
	// 初始化监控
	monitor := monigo.NewMonitor(
		monigo.WithInterval(10 * time.Second),
		monigo.WithHTTPEndpoint(":8081", "/metrics"),
	)
	monitor.Start()
	defer monitor.Stop()

	// 添加自定义指标
	monitor.AddCustomMetric("http_requests", monigo.Counter, "Total HTTP requests")
	monitor.AddCustomMetric("response_time", monigo.Histogram, "HTTP response time in ms")

	// 设置告警
	monitor.SetAlert(monigo.AlertConfig{
		Metric:    "memory_usage",
		Threshold: 90,
		Handler:   notifyMemoryAlert,
	})

	// 创建Gin路由
	r := gin.Default()
	
	// 添加监控中间件
	r.Use(func(c *gin.Context) {
		start := time.Now()
		
		c.Next()
		
		duration := time.Since(start).Milliseconds()
		monitor.Increment("http_requests")
		monitor.RecordValue("response_time", float64(duration))
	})

	r.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello, MoniGO!")
	})

	r.Run(":8080")
}

func notifyMemoryAlert(alert *monigo.Alert) {
	// 实现你的告警通知逻辑
	println("内存警报:", alert.Value, "%")
}

监控数据可视化

MoniGO收集的数据可以通过以下方式可视化:

  1. Prometheus + Grafana:将数据导出到Prometheus,然后用Grafana创建仪表盘
  2. 内置Web UI:MoniGO提供了简单的内置Web界面
  3. 自定义导出:可以将数据导出到任何你喜欢的监控系统

最佳实践

  1. 在生产环境中,建议将监控数据导出到外部存储系统
  2. 对于关键业务指标,设置合理的告警阈值
  3. 监控间隔不宜过短(至少5秒),以免影响应用性能
  4. 定期审查监控指标,移除不再需要的指标

MoniGO是一个灵活的工具,你可以根据实际需求选择启用或禁用特定功能。它的轻量级设计确保了对应用性能的最小影响,同时提供了强大的监控能力。

回到顶部