热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

方框_golangpromethusconsul服务发现

篇首语:本文由编程笔记#小编为大家整理,主要介绍了golangpromethusconsul服务发现相关的知识,希望对你有一定的参考价值。软件安装:

篇首语:本文由编程笔记#小编为大家整理,主要介绍了golang promethus consul 服务发现相关的知识,希望对你有一定的参考价值。



软件安装: 所需组件为: consul, promethus, grafana consul, grafana全部装在了本地, promethus运行在docker里面

docker pull consul
docker pull prom/prometheus
docker pull grafana/grafana

brew方式:

brew install grafana # grafana
brew tap hashicorp/tap # consul
brew install hashicorp/tap/consul # consul
brew install prometheus # prometheus 安装有点问题, 作者采用了docker方式

启动grafana:

brew services start grafana

访问:http://127.0.0.1:3000/

登录的时候默认用户名密码均为:admin

启动promethus:

docker run -d -p 8091:9090 --name=prometheus_server prom/prometheus # 主机9090被占用, 临时换成了8091

成功后访问http://127.0.0.1:8091/classic/graph

consul 前台启动:

consul agent -dev

这种方式只需要 ctrl + c 即可关闭 consul

正常启动:

consul agent -server -ui -bootstrap-expect=1 -data-dir=/Users/xxxxxx/consul_log -node=server-1 -client=0.0.0.0 -bind=192.168.3.241 -datacenter=dc1

启动成功后访问8500端口会出现如下界面:

自此所有组件启动完成(失败的情况请大家自行Google)


Promethus 配置pull方式

docker exec -it eb6c1878a8dc /bin/sh # eb6c1878a8dc 为promethus容器的id
vi /etc/prometheus/prometheus.yml

添加服务发现相关配置:

scrape_configs:
# - job_name: "prometheus"
# static_configs:
# - targets: ["192.168.3.241:22200","192.168.3.241:22201"]
- job_name: 'prometheus_monitor'
consul_sd_configs:
- server: '192.168.3.241:8500'
services: [prometheus_monitor]

static_configs中的targets为固定拉取部分,在容器化的今天,pod扩展后都需要手动修改很麻烦,采用服务发现的方式来发现节点才是理想的解决方式。services 是程序注册的服务名称,也支持正则的方式,具体请大家自行Google一下。

改完后的配置如下:

请确保server是可以访问到的地址,包括局域网或公网能否访问consul地址


客户端代码:

package main
import (
"flag"
"fmt"
"github.com/go-basic/uuid"
consulapi "github.com/hashicorp/consul/api"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"net"
"net/http"
"time"
)
var (
commandPort int
instanceId string // 实例Id
opsProcessed prometheus.Counter
)
const (
consulAddress = "127.0.0.1:8500"
)
func RecordMetrics()
for
opsProcessed.Inc()
time.Sleep(5 * time.Second)


func GetLocalIP() string
addressList, err := net.InterfaceAddrs()
if err != nil
return ""

for _, address := range addressList
if ipNet, ok := address.(*net.IPNet); ok && !ipNet.IP.IsLoopback()
if ipNet.IP.To4() != nil
return ipNet.IP.String()



return ""

func main()
flag.IntVar(&commandPort, "command_port", 22200, "command port")
flag.Parse()
fmt.Println("command_port: ", commandPort)
RegisterService()
opsProcessed = promauto.NewCounter(prometheus.CounterOpts
Name: "myapp_processed_ops_total",
Help: "The total number of processed events",
ConstLabels: map[string]string
"instance_id": instanceId,
,
)
go RecordMetrics()
http.HandleFunc("/", Handler)
http.Handle("/metrics", promhttp.Handler())
err := http.ListenAndServe(fmt.Sprintf(":%d", commandPort), nil)
if err != nil
fmt.Println("error: ", err.Error())


func RegisterService()
// 创建连接consul服务配置
config := consulapi.DefaultConfig()
config.Address = consulAddress
client, err := consulapi.NewClient(config)
if err != nil
fmt.Println("consul client error : ", err)
return

// 创建注册到consul的服务到
id := uuid.New()
instanceId = id
registration := new(consulapi.AgentServiceRegistration)
registration.ID = id
registration.Name = "prometheus_monitor" //根据这个名称来找这个服务
registration.Port = commandPort
registration.Address = GetLocalIP()
// 增加consul健康检查回调函数
check := new(consulapi.AgentServiceCheck)
check.HTTP = fmt.Sprintf("http://%s:%d", registration.Address, registration.Port)
check.Timeout = "5s" //超时
check.Interval = "5s" //健康检查频率
check.DeregisterCriticalServiceAfter = "30s" // 故障检查失败30s后 consul自动将注册服务删除
registration.Check = check
// 注册服务到consul
err = client.Agent().ServiceRegister(registration)

func Handler(w http.ResponseWriter, r *http.Request)
w.Write([]byte("pong"))

启动程序:

go run main.go
go run main.go -command_port 22202

consul结果如下:

promethus结果如下:

grafana添加数据源:


选择add data source后选择promethus

填写promethus server的地址,底部有个save and test

当出现下面这种情况的时候说明数据源可用,不可用的话请检查consul, 检查promethus是否发现节点,以及服务端的 http://xxxxxxx:xxxx/metrics的地址是否能访问且有数据,正常情况如下:

选中dashboard, 添加一个空的panel

底部方框输入: myapp_processed_ops_total, 这是我们在代码里面添加的指标名称

最终显示结果如下

到此整个流程完成, 在代码里面动态注册服务到consul,promethus server通过consul拿到所有注册组件的地址,然后主动去拉取数据,最后grafana通过进行展示。


推荐阅读
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
  • Go从入门到精通系列视频之go编程语言密码学哈希算法(二) ... [详细]
  • 2023年,Android开发前景如何?25岁还能转行吗?
    近期,关于Android开发行业的讨论在多个平台上热度不减,许多人担忧其未来发展。本文将探讨当前Android开发市场的现状、薪资水平及职业选择建议。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
  • CRZ.im:一款极简的网址缩短服务及其安装指南
    本文介绍了一款名为CRZ.im的极简网址缩短服务,该服务采用PHP和SQLite开发,体积小巧,约10KB。本文还提供了详细的安装步骤,包括环境配置、域名解析及Nginx伪静态设置。 ... [详细]
  • Python 领跑!2019年2月编程语言排名更新
    根据最新的编程语言流行指数(PYPL)排行榜,Python 在2019年2月的份额达到了26.42%,稳坐榜首位置。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 理解浏览器历史记录(2)hashchange、pushState
    阅读目录1.hashchange2.pushState本文也是一篇基础文章。继上文之后,本打算去研究pushState,偶然在一些信息中发现了锚点变 ... [详细]
  • 在日常生活中,支付宝已成为不可或缺的支付工具之一。本文将详细介绍如何通过支付宝实现免费提现,帮助用户更好地管理个人财务,避免不必要的手续费支出。 ... [详细]
  • 近期尝试从www.hub.sciverse.com网站通过编程手段获取数据时遇到问题,起初尝试使用WebBrowser控件进行数据抓取,但发现使用GET方法翻页时,返回的HTML代码始终相同。进一步探究后了解到,该网站的数据是通过Ajax异步加载的,可通过HTTP查看详细的JSON响应。 ... [详细]
  • 问题场景用Java进行web开发过程当中,当遇到很多很多个字段的实体时,最苦恼的莫过于编辑字段的查看和修改界面,发现2个页面存在很多重复信息,能不能写一遍?有没有轮子用都不如自己造。解决方式笔者根据自 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 本文详细介绍了如何正确设置Shadowsocks公共代理,包括调整超时设置、检查系统限制、防止滥用及遵守DMCA法规等关键步骤。 ... [详细]
  • Jupyter Notebook多语言环境搭建指南
    本文详细介绍了如何在Linux环境下为Jupyter Notebook配置Python、Python3、R及Go四种编程语言的环境,包括必要的软件安装和配置步骤。 ... [详细]
author-avatar
Blackn
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有