prometheus+Grafana+Kafka+ELK的基础搭建过程以及Kafka告警的基本实现

设置宿主机可访问桥接的虚拟机

在虚拟机[CentOS 8]上进行如下操作

$ systemctl stop firewalld.service  # 关闭虚拟机防火墙,需要root权限
$ ifconfig  # 查看虚拟机ip地址
$ nohup ./node_exporter & # 启动各种应用,例:node_exporter
$ netstat -tln # 查看监听端口

此后可在宿主机上通过 http://虚拟机IP:9100/metrics 访问部署在虚拟机上的node_exporter的数据。

其他服务类似。

Q:IP地址从哪里查看?

A:

  • 【CentOS】IP地址可通过ifconfig命令获取,如命令不存在,请通过yum install net-tools.x86_64安装该命令;

  • 【Windows】IP地址通过ipconfig命令获取。


通过WinSCP软件管理虚拟机上的文件

下载:https://winscp.net/download/WinSCP-5.17.6-Setup.exe

在这里插入图片描述

输入虚拟机的IP地址,22端口,填写root用户及密码,保存并登录,通过拖拽文件实现传输;

此外,WinSCP还可管理CentOS上的文件,包括复制、移动、删除、重命名、编辑,都可。


Prometheus 2.3.0

在这里插入图片描述

# 通过WinSCP传输prometheus-2.3.0.linux-amd64.tar.gz到Centos 8虚拟机的 /usr/local 目录下
> tar -xzvf prometheus-2.3.0.linux-amd64.tar.gz --remove-files # 解压文件
    -z	通过gzip指令压缩/解压缩文件,文件名最好为*.tar.gz
    -j	通过bzip2指令压缩/解压缩文件,文件名最好为*.tar.bz2
    -v	显示指令执行过程, 显示操作过程
    -f 	指定压缩包的名字
    -x 	解打包
    -c 	打包
    -C  指定解打包的目录(大写)
    --remove-files	归档/压缩之后删除源文件

把Prometheus设置为service,且开机启动

$ vi /etc/systemd/system/prometheus.service  # 配置服务文件,输入以下内容

[Unit]
Description=Prometheus
After=network.target

[Service]
ExecStart=/../prometheus-2.3.0.linux-amd64/promethus --connfig.file=/../prometheus-2.3.0.linux-amd64/promethus.yml

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload  # 重新加载配置文件
$ systemctl enable prometheus  # 设置prometheus开机启动
$ systemctl start prometheus  # 启动prometheus
$ systemctl status proemtheus  # 查看服务状态是否为active,以及查看日志

Prometheus Exporter

在这里插入图片描述

安装Node_exporter 1.0.1

# 通过WinSCP传输node_exporter-1.0.1.linux-amd64.tar.gz到Centos 8虚拟机的 /home/mqtt 目录下
> tar -xzvf node_exporter-1.0.1.linux-amd64.tar.gz # 解压文件
> cp -rf node_exporter-1.0.1.linux-amd64 /usr/local/prometheus/node_exporter-1.0.1.linux-amd64 # 把解压后的文件复制到/usr/local/prometheus/node_exporter-1.0.1.linux-amd64
    -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
    -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
    -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
    -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
    -f:覆盖已经存在的目标文件而不给出提示。
    -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。

把node exporter设置为service,且开机启动

$ vi /etc/systemd/system/node_exporter.service  # 配置服务文件,输入以下内容

[Unit]
Description=node_exporter
After=network.target

[Service]
ExecStart=/usr/local/prometheus/node_exporter-1.0.1.linux-amd64/node_exporter

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload  # 重新加载配置文件
$ systemctl enable node_exporter  # 设置node_exporter开机启动
$ systemctl start node_exporter  # 启动node_exporter
$ systemctl status node_exporter  # 查看服务状态是否为active

主要exporter展示

NameDescription主要metrics/功能
Node exporter提供主机、系统性能数据CPU使用率、内存使用率、硬盘使用率、网络带宽使用量、磁盘I\O、每小时网络流量等
cAdvisordocker监控由谷歌开发,cAdvisor(Container Advisor)让容器用户了解其运行容器的资源使用情况和性能特征。它是一个守护进程,收集、聚合、处理和导出有关正在运行的容器的信息。对于每个容器,cAdvisor保存了资源隔离参数、历史资源使用情况和网络统计信息。
RabbitMQ exporter消息队列RabbitMQ监控统计RabbitMQ中channel、connection、consumer、message、exchange的数量,统计处于各种状态的message的数量,统计connection的收发量,统计RabbitMQ node主机的运行时间、内存、磁盘等的主要数据。
kube-state-metrics提供Kubernetes集群的多维度数据它不关注Kubernetes组件的健康状况,而是关注集群内部各种对象的健康状况,比如deployments, nodes和pods。kube-state-metrics的数据直接从kubernetes API生成。
Blackbox exporter通过HTTP、HTTPS、DNS、TCP、ICMP协议从主机向其他主机发起请求,作黑盒探测从内网ping(ICMP)服务器以检测服务器存活状态、http检测http服务是否存活、进行SSL证书(HTTPS)有效期预警等。
Aliyun exporter监控多个阿里云服务器的数据Adhoc TopN 查询: 比如”找到当前对公网带宽消耗最大的 10 台服务器”; 容量规划: 比如”分析过去一个月某类型服务的资源用量”; 高级报警: 比如”对比过去一周的metrics值, 根据标准差进行报警”; 整合业务监控
Kafka exporter监控Kafka的broker数量、topics、consumer groups的多项数据kafka_brokers:broker的数量;kafka_topic_partitions:某个topic的partition(分区)数量;kafka_topic_partition_leader:某个topic的leader broker ID;kafka_topic_partition_replicas:topic的replication备份数量;kafka_consumergroup_lag:消息分发的延迟。————Kafka exporter所给出的全部metrics不多。
Windows exporter监控windows系统同node exporter相似,统计CPU、内存、服务进程状态、TCP、Users等指标
Redis exporter监控Redis数据库·暂缺·
Elasticsearch exporter监控elasticsearch数据分析系统对elasticsearch集群的节点、分片、文件系统、索引等进行数量上的统计,比如集群健康状态、节点数量、出错(tripped)的节点数量、健康活动的分片数量、文件系统使用率、I/O统计等,此外,还对elasticsearch这个进程以及它的java虚拟机内部各项指标进行监控,比如它进程的CPU占用、内存占用、线程池各项指标、对JVM内存池和GC机制的统计。
Mqtt blackbox exporter监测mqtt通信往返是否通畅的exporterprobe_mqtt_completed_total:总探测完成次数;probe_mqtt_duration_seconds:探测消息往返的时间消耗;probe_mqtt_messages_published_total:消息发出总量probe_mqtt_messages_received_total:收到消息总量probe_mqtt_started_total:已经开始的探测数量
Kibana exporter监控Kibana可视化工具的exporterkibana_status:Kibana的状态 -有三个健康状态 Green (1), Yellow (0.5) or Red (0).kibana_millis_uptime:已运行时间,以毫秒记。kibana_heap_*:堆内存使用情况相关;kibana_requests_*:发送请求数量,失联请求数量;kibana_plugin_elasticsearch:插件elasticsearch的健康状态,1为健康;kibana_plugin_logstash:插件logstash的健康状态,1为健康;kibana_concurrent_connections:连接到kibana的连接数;kibana_response_*:kibana做出响应的时间,最大值和平均值;

Grafana 7.0.4-1

安装Grafana

# 通过WinSCP传输grafana-7.0.4-1.x86_64.rpm到Centos 8虚拟机的 /home/mqtt 目录下
> yum install grafana-7.0.4-1.x86_64.rpm # 安装Grafana
# 通过WinSCP传输grafana-image-renderer.zip到Centos 8虚拟机的 /home/mqtt 目录下
> unzip -o -d /var/lib/grafana/plugins grafana-image-renderer.zip # 解压grafana-image-renderer[负责告警截图的插件]
    -l	显示压缩文件内所包含的文件
    -v	执行时显示详细的信息
    -c	将解压缩的结果显示到屏幕上,并对字符做适当的转换
    -n	解压缩时不要覆盖原有的文件
  	-o  不必先询问用户,unzip执行后覆盖原有文件。
  	-d  <目录> 指定文件解压缩后所要存储的目录。
> mv /var/lib/grafana/plugins/grafana-image-renderer/plugin-linux-x64-glibc grafana-image-renderer # 重命名文件夹plugin-linux-x64-glibc为grafana-image-renderer,grafana才能识别
> systemctl start grafana-server    # 启动grafana
> systemctl enable grafana-server.service    # 设置grafana开机启动
> systemctl status grafana-server    # 查看grafana服务状态

Grafana插件所在目录:/var/lib/grafana/plugins

Grafana Kafka REST Proxy Alerting 方式的实现

$ yum install java-1.8.0-openjdk-devel  # 安装JDK8
# 通过WinSCP传输confluent-5.5.1-2.12.tar.gz到Centos 8虚拟机的/home/mqtt目录下
$ tar -zxvf confluent-5.5.1-2.12.tar.gz # 安装Confluent
# 安装confluent CLI (Command Line Interface)
# 通过WinSCP传输confluent_latest_linux_amd64.tar.gz到Centos 8虚拟机的/home/wang目录下
$ mkdir -v confluentCLI
$ tar -zxvf confluent_latest_linux_amd64.tar.gz -C ~/confluentCLI
$ vi /etc/profile # 
	export CONFLUENT_HOME=~/confluent/confluent-5.5.1
$ logout  # 重新注销系统才能生效
$ cd confluent-5.5.1/bin
$ ./confluent local start # confluent包含了kafka及其依赖,该命令启动kafka、kafka-REST及其依赖

    The local commands are intended for a single-node development environment
    only, NOT for production usage. https://docs.confluent.io/current/cli/index.html

	Using CONFLUENT_CURRENT: /tmp/confluent.aHx9DmNu
        Starting zookeeper
        zookeeper is [UP]
        Starting kafka
        kafka is [UP]
        Starting schema-registry
        schema-registry is [UP]
        Starting kafka-rest
        kafka-rest is [UP]
        Starting connect
        connect is [UP]
        Starting ksql-server
        ksql-server is [UP]
        Starting control-center
        control-center is [UP]
        
$ ./kafka-topics --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test
		created topic test.
		
# 在Grafana web上设定notifications,Kafka REST Proxy设置为http://172.16.22.28:8082,topic设置为test

# 在Grafana web -> notifications -> kafka REST Proxy Channel 点击Send Test,consumer会收到Grafana-server发出的测试JSON数据

$ ./kafka-console-consumer --bootstrap-server localhost:9092 --topic test --from-beginning  # consumer接收topic:test发出的消息
    {
        "alert_state":"alerting",
        "client":"Grafana",
        "client_url":"http://localhost:3000/",
        "contexts":		
        [
            {
                "src":"https://grafana.com/assets/img/blog/mixed_styles.png",
                "type":"image"
            }
        ],
        "description":"Test notification - Someone is testing the alert notification within grafana.",
        "details":"Triggered metrics:\n\nHigh value: 100.000\nHigher Value: 200.000\n",
        "incident_key":"alertId-0"
    }
    # 收到Grafana发出的测试JSON数据
测试虚拟机的IP地址及所部署服务的对照
172.16.22.28 # Confluent[Kafka-REST]、Kafka

172.16.22.236 # Grafana-server

172.16.22.66 # Prometheus、node-exporter 开机启动

Kafka在win10系统上的搭建教程

安装准备

  • 下载jdk-8u251-windows-x64.exe

    安装路径:C:\Program Files\Java

    添加系统环境变量PATH="C:\Program Files\Java\jdk1.8.0_251\bin"

  • 下载zookeeper-3.4.14

    下载地址:https://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz

    安装路径:C:\Program Files\Kafka\zookeeper-3.4.14

    添加系统环境变量PATH="C:\Program Files\Kafka\zookeeper-3.4.14\bin"

    打开新的cmd窗口,执行zkServer,请勿关闭该cmd窗口,保持zookeeper运行。

更高版本在执行zkServer时可能会报错【ZooKeeper audit is disabled】

  • 安装Kafka 0.11

    https://archive.apache.org/dist/kafka/0.11.0.0/kafka_2.12-0.11.0.0.tgz

    安装路径:C:\Program Files\Kafka\kafka_2.12-0.11.0.0

    修改C:\Program Files\Kafka\kafka_2.12-0.11.0.0\config\server.properties

    log.dirs=C:\Program Files\Kafka\kafka_2.12-0.11.0.0\kafka-logs

    Kafka会按照默认,在9092端口上运行,并连接zookeeper的默认端口:2181

    打开新的cmd,执行以下命令,启动Kafka。

$ C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\kafka-server-start.bat "C:\Program Files\Kafka\kafka_2.12-0.11.0.0\config\server.properties"

zkServer日志显示以下类似消息,可忽略。

2020-07-01 10:54:00,298 [myid:] - INFO [ProcessThread(sid:0 cport:2181)::PrepRequestProcessor@653] - Got user-level KeeperException when processing sessionid:0x100001947d50000 type:create cxid:0x5 zxid:0x3 txntype:-1 reqpath:n/a Error Path:/brokers Error:KeeperErrorCode = NoNode for /brokers

这不是一个报错故障,只是一个user-level KeeperException。可以忽略不做处理的

kafka安装好后,第一次启动。zookeeper日志Error:KeeperErrorCode = NoNode for /config/topics/test

是因为kafka请求访问这个路径,但是这个路径还不存在,zookeeper就抛了这个error。

kafka会创建这个topic,然后访问zookeeper里topic对应的路径,zookeeper日志抛出error NodeExists for

/config/topics(kafka已经把topic创建好了),路径已经存在了。

综上所述,这些error是正常的日志信息,可以忽略。

测试Kafka

  • 打开C:\Program Files\Kafka\kafka_2.12-0.11.0.0\config\server.properties

    修改

    #advertised.listeners=PLAINTEXT://you.host.name:9092

    ->

    advertised.listeners=PLAINTEXT://localhost:9092

  • 执行命令 创建topic

$ C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
	Created topic "test".
  • 查看已创建的topic列表
$ C:\Program Files\Kafka\kafka_2.12-0.11.0.0\bin\windows>C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\kafka-topics.bat --list --zookeeper localhost:2181
	test
  • 创建Producer
$ C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test
	>hello_I'm_wang.
	> 
  • 创建consumer

    打开C:\Program Files\Kafka\kafka_2.12-0.11.0.0\config\consumer.properties

    在配置文件中添加以下内容

    bootstrap.servers=localhost:9092,localhost:2181

  • 执行命令 创建consumer

$ C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning
  • 查看topic
$ C:\Progra~1\Kafka\kafka_2.12-0.11.0.0\bin\windows\\kafka-topics.bat --describe --zookeeper localhost:2181 --topic test
	Topic:test PartitionCount:1 ReplicationFactor:1 Configs:
	Topic: test Partition: 0 Leader: 0 Replicas: 0 Isr: 0

ELK

安装

$ wget https://artifacts.elastic.co/downloads/logstash/logstash-7.8.0.tar.gz
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.0-linux-x86_64.tar.gz
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-7.8.0-linux-x86_64.tar.gz
$ tar -zxvf logstash-7.8.0.tar.gz
$ tar -zvxf elasticsearch-7.8.0-linux-x86_64.tar.gz
$ tar -zvxf kibana-7.8.0-linux-x86_64.tar.gz

测试 -> logstash

$ cd logstash-7.8.0
$ bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
Sending Logstash logs to /home/wang/logstash-7.8.0/logs which is now configured via log4j2.properties
[WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ][logstash.runner          ] Starting Logstash {"logstash.version"=>"7.8.0", "jruby.version"=>"jruby 9.2.11.1 (2.5.7) 2020-03-25 b1f55b1a40 Java HotSpot(TM) 64-Bit Server VM 25.51-b03 on 1.8.0_51-b16 +indy +jit [linux-x86_64]"}
[INFO ][org.reflections.Reflections] Reflections took 36 ms to scan 1 urls, producing 21 keys and 41 values 
[INFO ][logstash.javapipeline    ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>250, "pipeline.sources"=>["config string"], :thread=>"#<Thread:0x472c8923 run>"}
[INFO ][logstash.javapipeline    ][main] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[INFO ][logstash.agent           ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
helloworld  # 用户输入
/home/wang/logstash-7.8.0/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
       "message" => "helloworld",
          "host" => "localhost.localdomain",
      "@version" => "1",
    "@timestamp" => 2020-07-03T03:56:38.358Z
}  # logstash的输出

测试 -> elasticsearch

$ cd elasticsearch-7.8.0
$ bin/elasticsearch
[2020-07-03T11:43:37,240][INFO ][o.e.n.Node               ] [localhost.localdomain] version[7.8.0], pid[5084], build[default/tar/757314695644ea9a1dc2fecd26d1a43856725e65/2020-06-14T19:35:50.234439Z], OS[Linux/4.18.0-147.el8.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_51/25.51-b03]
[2020-07-03T11:43:37,240][INFO ][o.e.n.Node               ] [localhost.localdomain] JVM home [/usr/local/java/jdk1.8.0_51/jre]
[2020-07-03T11:43:37,241][INFO ][o.e.n.Node               ] [localhost.localdomain] JVM arguments [-Xshare:auto, -Des.networkaddress.cache.ttl=60, -Des.networkaddress.cache.negative.ttl=10, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -XX:-OmitStackTraceInFastThrow, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0
......
[2020-07-03T11:43:39,941][INFO ][o.e.p.PluginsService     ] [localhost.localdomain] loaded module [aggs-matrix-stats]
[2020-07-03T11:43:39,941][INFO ][o.e.p.PluginsService     ] [localhost.localdomain] loaded module [analysis-common]
......
[2020-07-03T11:43:39,947][INFO ][o.e.p.PluginsService     ] [localhost.localdomain] no plugins loaded
[2020-07-03T11:43:39,997][INFO ][o.e.e.NodeEnvironment    ] [localhost.localdomain] using [1] data paths, mounts [[/ (/dev/mapper/cl-root)]], net usable_space [7.4gb], net total_space [16.9gb], types [xfs]
[2020-07-03T11:43:39,997][INFO ][o.e.e.NodeEnvironment    ] [localhost.localdomain] heap size [1007.3mb], compressed ordinary object pointers [true]
......
[2020-07-03T11:43:49,648][INFO ][o.e.c.s.ClusterApplierService] [localhost.localdomain] master node changed {previous [], current [{localhost.localdomain}{y2t48C1-T8uM1EJVHHeH9g}{qHaG14AcRs27A4Co5Pa0pQ}{127.0.0.1}{127.0.0.1:9300}{dilmrt}{ml.machine_memory=3940311040, xpack.installed=true, transform.node=true, ml.max_open_jobs=20}]}, term: 1, version: 1, reason: Publication{term=1, version=1}
[2020-07-03T11:43:49,719][INFO ][o.e.h.AbstractHttpServerTransport] [localhost.localdomain] publish_address {127.0.0.1:9200}, bound_addresses {[::1]:9200}, {127.0.0.1:9200}
[2020-07-03T11:43:49,719][INFO ][o.e.n.Node               ] [localhost.localdomain] started
......

浏览器访问http://localhost:9200,有如下数据显示:

{
  "name" : "localhost.localdomain",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "VQ13xV-zRpyx_JpnyGaiMQ",
  "version" : {
    "number" : "7.8.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "757314695644ea9a1dc2fecd26d1a43856725e65",
    "build_date" : "2020-06-14T19:35:50.234439Z",
    "build_snapshot" : false,
    "lucene_version" : "8.5.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

测试 -> Kibana

$ cd kibana-7.8.0-linux-x86_64
$ vi config/kibana.yml
# 添加如下内容,保存退出

    #Elasticsearch主机地址
    elasticsearch.hosts: "http://localhost:9200" 
    # 允许远程访问
    server.host: "0.0.0.0" 
    # Elasticsearch用户名 这里其实就是我在服务器启动Elasticsearch的用户名
    elasticsearch.username: "wang"  
    # Elasticsearch鉴权密码 这里其实就是我在服务器启动Elasticsearch的密码
    elasticsearch.password: "CentOS系统中用户wang的password"
    
$ bin/kibana
  log   [03:50:12.522] [warning][plugins-discovery] Expect plugin "id" in camelCase, but found: apm_oss
  log   [03:50:12.533] [warning][plugins-discovery] Expect plugin "id" in camelCase, but found: triggers_actions_ui
  log   [03:50:37.231] [info][plugins-service] Plugin "visTypeXy" is disabled.
  ......
  log   [03:50:46.420] [info][status][plugin:apm_oss@7.8.0] Status changed from uninitialized to green - Ready
  log   [03:50:46.429] [info][listening] Server running at http://0.0.0.0:5601
  log   [03:50:46.857] [info][server][Kibana][http] http server running at http://0.0.0.0:5601

浏览器访问http://localhost:5601,出现UI画面。

  • 参考资料:

​ 《logstash最佳实践》:https://doc.yonyoucloud.com/doc/logstash-best-practice-cn/

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值