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可以看到相关数据库连接串指标

相关推荐
优秀的颜39 分钟前
计算机基础知识(第五篇)
java·开发语言·分布式
BillKu39 分钟前
Java严格模式withResolverStyle解析日期错误及解决方案
java
网安INF1 小时前
ElGamal加密算法:离散对数难题的安全基石
java·网络安全·密码学
AWS官方合作商2 小时前
在CSDN发布AWS Proton解决方案:实现云原生应用的标准化部署
java·云原生·aws
gadiaola3 小时前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
coderSong25685 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
Mr_Air_Boy6 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
豆沙沙包?7 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
年老体衰按不动键盘7 小时前
快速部署和启动Vue3项目
java·javascript·vue
咖啡啡不加糖7 小时前
Redis大key产生、排查与优化实践
java·数据库·redis·后端·缓存