首页 > 其他分享 >prometheus的sdk client_golang 使用 定时器

prometheus的sdk client_golang 使用 定时器

时间:2023-08-08 12:11:42浏览次数:42  
标签:触发 定时器 golang Now prometheus client time now Minute

之前线上监控的agent都是直接  time.Sleep(time.Duration(collectInterval) * time.Second) ,多少有些许的low,每次开始采集数据的时间都是从程序开始执行就开始采集,很显然这种偷懒的方式是不合理的。

1、简单复制粘贴一下

func AbNormalLoglistener(collectInterval int)  {
    abnormal_loglistener_Gauge := prometheus.NewGaugeVec(
        prometheus.GaugeOpts{
            Namespace: "tc",
            Subsystem: "serverMetricExtend",
            Name:      "abnormal_loglistener_log",
            Help:      "Loglistener An exception exists in the log file.",
        },
        []string{
            "hostname",
            "alert_name",
        },
    )
    prometheus.MustRegister(abnormal_loglistener_Gauge)

    _t := tools.Server{}
    sname := _t.GetServerHostName()

    go func() {
        defer func() {
            if r := recover(); r != nil {
                metricLog.Error(r)
            }
        }()

        ticker := time.NewTicker(time.Duration(collectInterval) * time.Second)
        now := time.Now()
        nextMinute := now.Truncate(time.Duration(collectInterval) * time.Second).Add(time.Duration(collectInterval) * time.Second)
        waitTime := nextMinute.Sub(now)
        time.Sleep(waitTime)

        for {
            metricsBack := _t.FetchDirModTime()
            for alert_name, status := range metricsBack{
                abnormal_loglistener_Gauge.With(prometheus.Labels{"hostname": sname, "alert_name": alert_name}).Set(float64(status))
            }

            <-ticker.C
            nextMinute = nextMinute.Add(time.Duration(collectInterval) * time.Second)
            waitTime = nextMinute.Sub(time.Now())
            time.Sleep(waitTime)

        }
    }()
}

2、方式一 time.Ticker

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个定时器,每隔一分钟触发一次
    ticker := time.NewTicker(time.Minute)

    // 获取当前时间
    now := time.Now()

    // 计算下一分钟的开始时间
    nextMinute := now.Truncate(time.Minute).Add(time.Minute)

    // 计算需要等待的时间
    waitTime := nextMinute.Sub(now)

    // 等待到下一分钟的开始时间
    time.Sleep(waitTime)

    // 使用一个无限循环来控制方法的执行
    for {
        // 执行你的方法
        fmt.Println("执行方法")

        // 等待定时器的下一次触发事件
        <-ticker.C

        // 计算下一分钟的开始时间
        nextMinute = nextMinute.Add(time.Minute)

        // 计算需要等待的时间
        waitTime = nextMinute.Sub(time.Now())

        // 等待到下一分钟的开始时间
        time.Sleep(waitTime)
    }
}

 

3、方式二 time.Timer

package main

import (
    "fmt"
    "time"
)

func main() {
    // 获取当前时间
    now := time.Now()

    // 计算下一分钟的开始时间
    nextMinute := now.Truncate(time.Minute).Add(time.Minute)

    // 计算需要等待的时间
    waitTime := nextMinute.Sub(now)

    // 创建一个定时器,在等待时间结束后执行任务
    timer := time.NewTimer(waitTime)

    // 使用一个无限循环来控制协程的执行
    for {
        <-timer.C // 等待定时器的触发事件

        // 执行你的协程任务
        go func() {
            fmt.Println("执行协程任务")
            // 在这里编写你的协程任务逻辑
        }()

        // 计算下一分钟的开始时间
        nextMinute = nextMinute.Add(time.Minute)

        // 重新计算需要等待的时间
        waitTime = nextMinute.Sub(time.Now())

        // 重置定时器
        timer.Reset(waitTime)
    }
}

 

4、这两种方式的区别,gpt给的答案,请各位自行斟酌

  1. time.NewTimer

    • time.NewTimer 创建一个单次触发的定时器,它在指定的时间间隔过后触发一次。
    • 适用于需要在指定时间间隔后执行一次操作的场景。
    • 可以使用 timer.Reset 方法重新设置定时器的触发时间。
  2. time.NewTicker

    • time.NewTicker 创建一个重复触发的定时器,它会以固定的时间间隔重复触发。
    • 适用于需要定期执行某个操作的场景,比如每隔一段时间执行一次任务。
    • 每次触发时,time.Ticker 类型的值会发送一个时间到其内部的通道 C,你可以使用 <-ticker.C 来等待触发事件。
    • 可以使用 ticker.Stop 方法停止定时器的触发。

 

5、一些点的解惑

m := time.Now().Truncate(time.Minute)
fmt.Printf("m:%s\n",m )

s := time.Now().Truncate(time.Duration(3600) * time.Second)
fmt.Printf("s:%s\n",s )

执行返回结果,自行感受,time.Now().Truncate():

m:2023-08-08 11:56:00 +0800 CST
s:2023-08-08 11:00:00 +0800 CST

 

6、文章仅个人记录,要想深入请自行分析源码。

 

标签:触发,定时器,golang,Now,prometheus,client,time,now,Minute
From: https://www.cnblogs.com/bill2014/p/17613827.html

相关文章

  • OPCClient可视化工具使用教程
    OPCClient可视化工具使用教程1、下载OPCClient,直接打开,进入如下界面: 2、点击OPC=>Connect,ServerNode输入服务器ip,点击RefreshList,下面文本框会出现服务名,选择所需要的服务名称,点击OK或双击服务名3、点击OPC=>AddItem,出现下图4、选择左下框,右框出现所有节点,双击节点即......
  • golang之性能分析工具pprof
    PProf 是一个 Go 程序性能分析工具,可以分析 CPU、内存等性能。Go 在语言层面上集成了 profile 采样工具,只需在代码中简单地引入 runtime/ppro 或者 net/http/pprof 包即可获取程序的 profile 文件,并通过该文件来进行性能分析。 在 gin 中使用 pprof 功能,需要......
  • k8s安装prometheus
    安装在目标集群上,执行如下命令:kubectlapply-fhttps://github.com/512team/dhorse/raw/main/conf/kubernetes-prometheus.yml使用1.在浏览器访问地址:http://master_ip:30000,如下图所示:2.查看k8s自带的指标数据,如下图所示:3.点击“Execute”按钮,并切换到“Graph”选项卡,......
  • [golang]使用mTLS双向加密认证http通信
    前言假设一个场景,服务端部署在内网,客户端需要通过暴露在公网的nginx与服务端进行通信。为了避免在公网进行http明文通信造成的信息泄露,nginx与客户端之间的通信应当使用https协议,并且nginx也要验证客户端的身份,也就是mTLS双向加密认证通信。这条通信链路有三个角色:服务端、N......
  • Go / Golang JSON 一些心得
    自定义序列化和反序列化可以实现json.Marshaler和json.Unmarshaler自定义json的序列化和反序列化typeTags[]stringfunc(tTags)MarshalJSON()([]byte,error){return[]byte(strconv.Quote(strings.Join(t,","))),nil}func(t*Tags)UnmarshalJSON(b[]b......
  • golang之浮点数处理库decimal
    decimal库包是用来解决float类型对象之间运算不准确的问题的。所以,如果你想使用decimal库包,你必须先把float类型对象通过decimal.NewFromFloat()函数转成decimal.Decimal类型,然后再计算,最后还得再转成你所需要的类型。范例:packagemainimport"log"funcmain(){a:=......
  • 用 Prometheus 打造云原生监控
    数字化转型背景下,随着轻量化的容器化技术和微服务应用的深度融合,业务复杂度随之上升。基于Prometheus的容器云监控体系成为目前主流容器监控事实标准,本文主要介绍Prometheus云原生监控体系,涵盖指标采集、数据存储、可视化展示,告警入库等功能,结合生产实践供大家参考。一、监控对象Pr......
  • 初识Go(Golang)语言
    初识Go(Golang)语言Go的诞生1.Go语言的发展历程 2007年,谷歌工程师RobPike,KenThompson和RobertGriesemer开始设计一门全新的语言,这是Go语言的最初原型。 2009年11月10日,Google将Go语言以开放源代码的方式向全球发布。 2015年8月19日,Go1.5版发布,本次......
  • 从 Pulsar Client 的原理到它的监控面板
    背景前段时间业务团队偶尔会碰到一些Pulsar使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据topic维度查看他的发送状态,比如速率、流量、消费状态等信息。但也有几个问题:无法在应用维度查看他所依赖的所有topic的各种......
  • [Go笔记] 基础-01: Golang发展简史、著名项目及基本使用
    引言Golang,又称Go语言,是一门开源的静态类型编译型编程语言。自从2007年由谷歌的罗伯特·格里泽默(RobertGriesemer)、罗布·派克(RobPike)和肯·汤普森(KenThompson)共同设计,Go语言已经成为了众多开发者的首选。发展史2009年11月,Go语言正式对外公布。2012年,Go1.0版本发布。自那......