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 小时前
Grafana 与 InfluxDB 可视化深度集成(二)
信息可视化·数据分析·grafana
云游19 小时前
大模型性能指标的监控系统(prometheus3.5.0)和可视化工具(grafana12.1.0)基础篇
grafana·prometheus·可视化·监控
qq_232045572 天前
非容器方式安装Prometheus和Grafana,以及nginx配置访问Grafana
nginx·grafana·prometheus
测试开发Kevin2 天前
详解grafana k6 中stage的核心概念与作用
测试工具·压力测试·grafana
夜莺云原生监控2 天前
Prometheus 监控 Kubernetes Cluster 最新极简教程
容器·kubernetes·prometheus
SRETalk3 天前
Prometheus 监控 Kubernetes Cluster 最新极简教程
kubernetes·prometheus
川石课堂软件测试3 天前
JMeter并发测试与多进程测试
功能测试·jmeter·docker·容器·kubernetes·单元测试·prometheus
SRETalk4 天前
夜莺监控的几种架构模式详解
prometheus·victoriametrics·nightingale·夜莺监控
天翼云开发者社区4 天前
Grafana无法启动修复解决
grafana
Ditglu.4 天前
使用Prometheus + Grafana + node_exporter实现Linux服务器性能监控
服务器·grafana·prometheus