grafana+prometheus+loki的使用

grafana官网:https://grafana.com/zh-cn/grafana/

grafana下载:https://grafana.com/grafana/download?pg=graf&plcmt=deploy-box-1

promtheus官网:https://prometheus.io/docs/introduction/overview/

promtheus和采集服务下载:https://prometheus.io/download/

loki github地址:https://github.com/grafana/loki/

loki配置文件下载:https://raw.githubusercontent.com/grafana/loki/v1.5.0/cmd/loki/loki-local-config.yaml

loki push API:https://grafana.com/docs/loki/latest/reference/api/#push-log-entries-to-loki

1、说明

本文介绍使用grafana+prometheus+loki实现数据和日志的方法,其中数据和日志的采集使用自定义采集的方式,使用既有协议,发送到数据库源存储

  • grafana负责界面展示配置
  • prometheus负责数据的存储,为grafana提供数据源(exporter等应用负责数据采集)
  • loki负责日志的存储,为grafana提供数据源(promtail负责日志的采集)

架构图如下:

2、grafana部署

根据对应的系统下载对应包,以二进制为例

bash 复制代码
./bin/grafana server #启动grafana

默认配置文件是 /conf/default.ini,其中 http_port 一项是服务的http访问端口

启动后,打开浏览器访问:http://127.0.0.1:3000

默认用户名和密码都是:admin,登录后会提示改密码

3、prometheus部署

prometheus 是一种时序数据库,用于存放数据,也可以作为 grafana 的数据源提供数据

3.1、自定义采集程序

下面程序以随机数示例

go 复制代码
package collector

import (
    "github.com/prometheus/client_golang/prometheus"
    "math/rand"
)

type Test struct {
    queryCountDesc *prometheus.Desc
}

func (e *Test) Init(config *ExporterConfig) {
    e.queryCountDesc = prometheus.NewDesc(
        prometheus.BuildFQName(NAMESPACE, "", config.ExporterName), // 自定义指标名称
        config.HelpInfo,                                            // 指标的help信息
        []string{"sensor_type"},                                    //这里要和下面的metric一一对应上
        prometheus.Labels{},
    )
}

func (e *Test) Describe(ch chan<- *prometheus.Desc) {
    ch <- e.queryCountDesc
}

func (e *Test) Collect(ch chan<- prometheus.Metric) {
    queryCount := e.CalcFrequency()
    ch <- prometheus.MustNewConstMetric(
        e.queryCountDesc,
        prometheus.CounterValue,
        float64(queryCount),
        "sensor_name", //这里是传感器名称,要和上面desc一一对应上
    )
}

func (e *Test) CalcFrequency() float64 {
    return rand.Float64() //随机数
}

main入口

go 复制代码
func main() {
    // 实例化并注册数据采集器exporter
    reg := prometheus.NewPedanticRegistry()
    for _, sensorConfig := range yamlConfig.ROSConfig.SensorConfig {
        if sensorConfig.Enable {
            getCollector := collector.GetCollector(&collector.ExporterConfig{
                Node:         node,
                HelpInfo:     sensorConfig.Help,
                TopicName:    sensorConfig.Topic,
                ExporterName: sensorConfig.Name,
            })
            reg.MustRegister(getCollector)
            log.Info("register topic: %s", sensorConfig.Topic)
        }
    }

    // 定义一个采集数据的采集器集合,它可以合并多个不同的采集器数据到一个结果集合中
    gatherers := prometheus.Gatherers{
        reg, //自定义的采集器
    }

    // 启动http服务
    h := promhttp.HandlerFor(gatherers,
        // HandlerFor函数传递上边的gatherers对象,并返回一个httpHandler对象h。
        // 这个httpHandler对象h可以调用其自身的ServHTTP函数来接收HTTP请求,并返回响应
        promhttp.HandlerOpts{
            ErrorHandling: promhttp.ContinueOnError, // 采集过程中如果出现错误,继续采集其他数据,不会中断采集器的工作
        })

    // 创建一个HTTP处理器来暴露指标
    http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
        log.Debug("start...")
        h.ServeHTTP(w, r)
    })

    // 启动Web服务器,对外接口9101,交由prometheus来访问获取数据
    err = http.ListenAndServe(fmt.Sprintf(":%d", 9101), nil)
    if err != nil {
        log.Error("listen and server fail, error: %s", err.Error())
        return
    }
}

3.2、prometheus配置

官方提供了很多常见的数据采集服务,可以根据需要自用,比如:node_exporter服务主要采集服务器的系统参数。本次以自定义数据采集示例

prometheus 下载解压后,进入目录,如下:

bash 复制代码
.
├── console_libraries
├── consoles
├── data
├── LICENSE
├── NOTICE
├── prometheus
├── prometheus.yml
└── promtool

prometheus 是需要执行的二进制,prometheus.yaml 是配置文件,修改配置

yaml 复制代码
scrape_configs:
  - job_name: "node"
    static_configs:
      - targets: ["localhost:9101"]

其他配置不管,这里配置采集程序

job_name 是采集程序名称

static_configs 配置采集程序的http地址,可以是多个,这里配置端口是9101,就是上面自定义采集程序开放的9101端口

3.3、运行prometheus

bash 复制代码
./prometheus --config.file="prometheus.yml" #使用指定配置文件启动prometheus

peometheus 默认使用9090端口提供数据,也可以访问查看配置情况,

打开浏览器,访问:http://127.0.0.1:9090/

以此点击:Status -> Target,可以看到配置的采集服务,如下图:

这里是采集服务没有运行,如果运行,则可以点击EndPoint进入查看数据

4、loki部署

loki下载解压,看一下loki的配置文件,部分配置说明如下:

yaml 复制代码
server:
  http_listen_port: 3100 #loki接收的http端口

运行loki

bash 复制代码
./loki-linux-amd64 -config.file=loki-local-config.yaml

运行后查询采集内容,打开浏览器,访问:http://127.0.0.1:3100/metrics,即可看到原始数据上报

4.1、自定义日志采集

loki开放http接口接收日志,从文档中找到push api即可使用

http 复制代码
POST /loki/api/v1/push

header中添加

http 复制代码
Content-Type: application/json

body内容

json 复制代码
{
  "streams": [
    {
      "stream": {
        "label": "value"
      },
      "values": [
          [ "<unix epoch in nanoseconds>", "<log line>" ],
          [ "<unix epoch in nanoseconds>", "<log line>" ]
      ]
    }
  ]
}

测试

bash 复制代码
$ curl -v -H "Content-Type: application/json" -XPOST -s "http://localhost:3100/loki/api/v1/push" --data-raw \
  '{"streams": [{ "stream": { "foo": "bar2" }, "values": [ [ "1570818238000000000", "fizzbuzz" ] ] }]}'

5、grafana配置

5.1、添加数据源

登录grafana,打开左上角菜单栏 -> Connections -> Data sources -> Add new data source,添加数据源,这里要添加两个

选择 prometheus,输入URL:http://localhost:9090(根据实际url修改),点击最下方的Save& test,保存并测试

选择 loki,输入URL:http://localhost:3100(根据实际url修改),点击最下方的Save& test,保存并测试

5.2、自定义面板

打开左上角菜单栏 -> Dabshboards -> New,创建新面板,自己摸索配置即可

相关推荐
福大大架构师每日一题14 小时前
37.1 prometheus管理接口源码讲解
ios·iphone·prometheus
Cairry.1 天前
WatchAlert - 开源多数据源告警引擎
云原生·开源·prometheus
Mitch3111 天前
【漏洞复现】CVE-2023-37461 Arbitrary File Writing
web安全·网络安全·prometheus·metersphere·漏洞复现
福大大架构师每日一题4 天前
36.3 grafana-dashboard看图分析
linux·网络·grafana·prometheus
福大大架构师每日一题4 天前
36.2 内置的k8s采集任务分析
算法·贪心算法·kubernetes·prometheus
点燃银河尽头的篝火(●'◡'●)5 天前
【环境搭建】Grafana本地部署搭建(windows系统)
windows·grafana·环境搭建
Algorithm15765 天前
linux/ubuntu安装Prometheus&Grafana
linux·ubuntu·prometheus
福大大架构师每日一题9 天前
35.4 thanos-query 源码阅读
java·spring·ios·prometheus
福大大架构师每日一题9 天前
35.3 thanos-store 源码阅读
ios·iphone·prometheus
童安格粉丝10 天前
Grafana配置告警规则推送企微机器人服务器资源告警
机器人·企业微信·grafana·告警·dashboard·阈值