grom接入Prometheus,grafana

在同级目录下分别创建

docker-compose.yml,与prometheus.yml 配置文件

复制代码
version: '3.8'

services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    ports:
      - "9090:9090"  # Prometheus Web UI 端口
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    networks:
      - monitoring

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    networks:
      - monitoring
    depends_on:
      - prometheus

  pushgateway:
    image: prom/pushgateway
    container_name: pushgateway
    ports:
      - "9091:9091"
    networks:
      - monitoring

networks:
  monitoring:
    driver: bridge

global:
  scrape_interval: 5s  //采集指标频次

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['host.docker.internal:8181'] //我这边是宿主机运行程序,在同一bridge下面安装的prometheus与granfa.
      如果程序以容器运行,加入同一个bridge下面。docker容器访问宿主机host配置host.docker.internal

gorm中间件配置

复制代码
func init() {
	// 设置MySQL连接信息
	dsn := "sa:sa123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"

	// 创建一个GORM连接
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		fmt.Println("Failed to connect to the database:", err)
		return
	}
	db.Use(prometheus.New(prometheus.Config{
		DBName:          "test", // 使用 `DBName` 作为指标 label
		RefreshInterval: 15,     // 指标刷新频率(默认为 15 秒)
		PushAddr:        "",     // 如果配置了 `PushAddr`,则推送指标
		StartServer:     true,   // 启用一个 http 服务来暴露指标
		HTTPServerPort:  8181,   // 配置 http 服务监听端口,默认端口为 8080 (如果您配置了多个,只有第一个 `HTTPServerPort` 会被使用)
		MetricsCollector: []prometheus.MetricsCollector{
         // 从 SHOW STATUS 选择变量变量,如果不设置,则使用全部的状态变量
			&prometheus.MySQL{
				VariableNames: []string{"Threads_running"},
			},
		},
	}))
	// 获取通用数据库对象 sql.DB
	sqlDB, err := db.DB()
	if err != nil {
		fmt.Println("Failed to get generic database object:", err)
		return
	}

	// 设置连接池参数
	// SetMaxIdleConns 用于设置连接池中空闲连接的最大数量
	sqlDB.SetMaxIdleConns(10)

	// SetMaxOpenConns 设置打开数据库连接的最大数量
	sqlDB.SetMaxOpenConns(100)

	// SetConnMaxLifetime 设置了连接可复用的最大时间
	sqlDB.SetConnMaxLifetime(time.Hour)
	global.DB = db
	// 检查连接是否成功
	fmt.Println("Connected to the database successfully")
}

监听成功

我们用go的高并发 限制运行协程数量最大100.

复制代码
// SetMaxOpenConns 设置打开数据库连接的最大数量
sqlDB.SetMaxOpenConns(100)
复制代码
func save() {

	// 设置随机种子
	rand.Seed(time.Now().UnixNano())

	// 插入2000万条数据
	batchSize := 1000
	totalRecords := 20000000
	var wg errgroup.Group
	wg.SetLimit(100)
	for i := 0; i < totalRecords/batchSize; i++ {
		num := i
		wg.Go(func() error {
			var employees []Employee
			//for j := 0; j < batchSize; j++ {
			employees = append(employees, Employee{
				EmpNo:     num*batchSize + num + 1,
				BirthDate: randomDate(time.Date(1950, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2000, 12, 31, 0, 0, 0, 0, time.UTC)),
				FirstName: randomString(14),
				LastName:  randomString(16),
				Gender:    randomGender(),
				HireDate:  randomDate(time.Date(1980, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2024, 12, 31, 0, 0, 0, 0, time.UTC)),
			})
			fmt.Printf("Inserted %d records\n", (i+1)*batchSize)
			global.DB.Create(&employees)
			return nil
		})
		//fmt.Printf("Inserted %d records\n", (i+1)*batchSize)
	}
	wg.Wait()
}

在prometheus可以看到相关指标信息

在granfa配置好相关datasoure可以看到相关数据库连接串指标

相关推荐
维天说2 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19942 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
Elastic 中国社区官方博客2 小时前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana
噢,我明白了3 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品3 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘3 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记4 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵4 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室5 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发
我是唐青枫5 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java·spring