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

相关推荐
一只猿Hou8 分钟前
java分页插件| MyBatis-Plus分页 vs PageHelper分页:全面对比与最佳实践
java·mybatis
程序员弘羽13 分钟前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
旷世奇才李先生17 分钟前
Tomcat 安装使用教程
java·tomcat
微风◝30 分钟前
12. grafana-Dashboard的Variable(过滤)使用
grafana
勤奋的知更鸟31 分钟前
Java 编程之策略模式详解
java·设计模式·策略模式
qq_49244844632 分钟前
Java 访问HTTP,信任所有证书,解决SSL报错问题
java·http·ssl
爱上语文36 分钟前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen1 小时前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
深栈解码1 小时前
JMM深度解析(三) volatile实现机制详解
java·后端
liujing102329292 小时前
Day04_刷题niuke20250703
java·开发语言·算法