grafana呈现loki从k8s/ingress-nginx中收集的日志-地区经纬度部分

这篇具有很好参考价值的文章主要介绍了grafana呈现loki从k8s/ingress-nginx中收集的日志-地区经纬度部分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

零,缘起

1,在用grafana展示loki日志的时候,想到用可视化的方式来呈现更直观,于是网上查找,找到一篇《如何用Loki来绘制Ingress Nginx监控大屏》被复用多次,按照其过程实践引用了12559的面板,但效果与原文描述的不一致,可能是gf版本,或者插件版本变更等原因造成。尝试了几次终能正常显示部分数据。

一,用到的插件面板数据等

插件: worldmap panel(在线安装或手工下载安装)需要持久化grafana的插件目录,修改grafana.ini文件。显示地图上面的位置可以使用经纬度或geohash,此例用经纬度,依赖于geoip2中的数据库。内部或局域网地址解析出来的结果为空可忽略。

插件:geomap,只支持到国家地区。

nginx模块:geoip2(禁用geoip),geoip数据库,需要持久化/etc/nginx/geoip目录以保存数据。

二,步骤过程

此处使用的是ingress-nginx,nginx-ingress和其它的与此操作会有所不同。

1,ingress-nginx修改配置文件

配置文件最好写在一行内,在日志中呈现会比较容易看,json解析时可能会因为换行等问题失败。注意去掉#号及注释内容。

1.1,停用geoip启用geoip2
1.2,修改日志格式转为json,并指定要获取数据的字段,第4行 geoip_country_code,latitude,longitude,geoip_city_code其后对应的变量都是从geoip2中获取。
1.3,启用ingress真实IP转发 前三行

位于ingressnginx的命名空间中的configmap:ingress-nginx-controller-nginx,字段名称定义和面板查询中的字段名要保持一致。

apiVersion: v1
data:
  compute-full-forwarded-for: 'true'     #ingress转发真实客户端IP
  forwarded-for-header: X-Forwarded-For  #ingress转发真实客户端IP
  log-format-escape-json: 'true'         #ingress转发真实客户端IP
  log-format-upstream: >-
    {"timestamp": "$time_iso8601", 
    "requestID": "$req_id",
    "proxyUpstreamName": "$proxy_upstream_name",
    "host": "$host",
    "proxyAlternativeUpstreamName": "$proxy_alternative_upstream_name",
    "upstreamStatus": "$upstream_status",
    "geoip_country_code": "$geoip2_city_country_code",  #从城市库中取国家
    "latitude": "$geoip2_latitude",       #从城市库中取经度
    "longitude": "$geoip2_longitude",     #从城市库中取纬度
    "geoip_city_code": "$geoip2_city",    #从城市库中取城市名拼音
    "upstreamAddr": "$upstream_addr",
    "request_time": "$request_time",
    "httpRequest":{
      "requestMethod": "$request_method",
      "requestUrl": "$request_uri", 
      "status": $status,
      "requestSize": "$request_length", 
      "responseSize": "$upstream_response_length",
      "userAgent": "$http_user_agent",
      "remote_addr": "$remote_addr",     #获取客户端IP,有些版本此值不对
      "referer": "$http_referer",
      "latency": "$upstream_response_time",
      "protocol":"$server_protocol"
    }
    }
  use-forwarded-headers: 'true'
  use-geoip: 'false'   #关闭geoip
  use-geoip2: 'true'   #启用geoip2
kind: ConfigMap
……

2,下载geoip2对应的三个库

放到nginx-ingress容器中的/etc/nginx/geoip下面。持久化该目录挂载后再改上面的配置,否则会提示找不到这些文件。

2.1,官网注册后下载:Thank You | MaxMind 

2.2,github上面下载(注意版本,建议去原仓库找最新版本)

https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.01.22/GeoLite2-ASN.mmdb
https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.01.22/GeoLite2-City.mmdb
https://github.com/P3TERX/GeoLite.mmdb/releases/download/2024.01.22/GeoLite2-Country.mmdb

GeoLite2-ASN.mmdb 区域?
GeoLite2-City.mmdb  城市
GeoLite2-Country.mmdb 国家

2.3,修改完后观察ingress日志,是否有错误如找不到对应的变量,找不到数据库文件等。在运行正常后从公网访问该服务器查看访问日志中是否正确携带出来地区,经纬度信息,如果有表示配置完成。

3,loki收集ingress-nginx日志略

4,grafana安装及面板安装

grafana安装略

4.1,安装面板并持久化

持久化/var/lib/grafana/plugins目录(路径根据自己实际情况)

4.1.1,手工下载安装:下载worldmap panel插件手工放入到/var/lib/grafana/plugins/下面并解压,保持插件文件目录名并做成持久化挂载。目前下载到的是1.0.6
注意事项:1.0.6版本和grafana10有些冲突,会显示过时API,貌似不影响使用。

4.1.2,grafana在线安装,网络正常能访问到的可使用,默认安装应该是新版本

grafana-cli plugins install grafana-worldmap-panel

4.2,修改插件显示地图

因worldmap插件中原来的地图地址无法访问到所以需要修改,改worldmap module.js和module.js.map文件中的默认瓦片地图下载地址,指令没测试过,手工修改替换文件覆盖也可。

sed -i 's/https:\/\/cartodb-basemaps{s}.global.ssl.fastly.net\/light_all\/{z}\/{x}\/{y}.png/http:\/\/{s}.basemaps.cartocdn.com\/light_all\/{z}\/{x}\/{y}.png/' \
module.js \
module.js.map

sed -i 's/https:\/\/cartodb-basemaps-{s}.global.ssl.fastly.net\/dark_all\/{z}\/{x}\/{y}.png/http:\/\/{s}.basemaps.cartocdn.com\/dark_all\/{z}\/{x}\/{y}.png/'  \
module.js \
module.js.map 

4.3,未签名问题处理1

修改后需要删除原始签名信息 MANIFEST.txt 将其改名或删除,否则会在grafana重启后报签名不符。


4.4,未签名问题处理2

修改grafana.ini配置文件或添加环境变量以允许加载没有签名的面板:

grafana.ini中的位置

[plugins]

allow_loading_unsigned_plugins = grafana-worldmap-panel

或修改yaml或docker的环境变量配置(与INI字段对应关系)。

- name: GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS
  value: grafana-worldmap-panel

重启grafana启动日志中出现:Permitting unsigned plugin. This is not recommended即正常。

5,grafana中添加查询面板

添加loki数据源略
5.1,logql示例:

 从ingress中过滤为json并排除错误解析,并格式化只要几个主要字段,根据城市,经纬度字段汇总。

sum by (geoip_city_code,latitude,longitude) (count_over_time({job=~"ingress-nginx/ingress-nginx-controller-nginx"} |json | __error__="" | line_format "{{.geoip_city_code}}  {{.latitude}} {{.longitude}} " [$__interval]))

grafana 12559,grafana,kubernetes,nginx5.2,数据转化处理

Transform将上述查询的结果从series转为row也就是table的格式。因为worldmap panel面板支持的几种格式中,只有这种和日志中获取到的经纬度比较好对应。其它如geohash等都不好处理。


transform在8.x和10.x的面板上面添加了也会无法编辑。于是复制面板中自带的json,这样就可以在table view视图中查看到查询结果便于调整。以下是转换的json,可直接复制替换到transformations位置使用。

grafana 12559,grafana,kubernetes,nginx

注意最后的逗号,如果不是在最后位置就要添加。在最后可不添加。

"transformations": [
    {
      "id": "reduce",
      "options": {
        "reducers": [
          "sum"
        ],
        "labelsToFields": true  #显示字段出来便于查看
      }
    }
  ],

使用table view查看查询出来的数据和字段,和面板配置字段对应。

grafana 12559,grafana,kubernetes,nginx
5.3,面板数据来源和字段映射配置

来源配置为table,取合字段设置为total;

grafana 12559,grafana,kubernetes,nginx

字段映射,来源于logql查询的字段

grafana 12559,grafana,kubernetes,nginx

字段映射配置
Map Data Options
Location Data:    table
Aggregation:  total

Field Mapping 字段映射
Table Query Format: coordinates #数据格式

Location Name Field: geoip_city_code 
Metric Field: Total #名称
Latitude Field: latitude  #纬度
Longitude Field: longitude #经度

5.4,字段映射和json解析二级列表展开的情况

logql用json解析json内容时,出现有第二层级内容时,会将其展开,用上级名称_二级名称的形式体现。

所以在面板中可能存在用字段名取不到第二层值的情况,就需要在前面加上上一级名称。如:

httpRequest_status->对应原json中的 httpRequest: {status: 200}

6,完成

正常情况下如图所示结果:颜色,样式等细节再调整,还有可以汉化地图文字的没有尝试。

(没有图了图片违规,可能是地图插件的地图源里面有内容不符合要求)自己想象吧。

grafana面板ID:12559文章来源地址https://www.toymoban.com/news/detail-834057.html

到了这里,关于grafana呈现loki从k8s/ingress-nginx中收集的日志-地区经纬度部分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第12关 精通K8s下的Ingress-Nginx控制器:生产环境实战配置指南

    ------ 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维,这节课带来k8s的流量入口ingress,作为业务对外服务的公网入口,它的重要性不言而喻,大家一定要仔细阅读,跟着博哥的教程一步步实操去理解。 Ingress基本概念 在Kubernetes集群中,Ingress作为集群内服务对外

    2024年02月03日
    浏览(46)
  • K8s实战4-使用Helm在Azure上部署Ingress-Nginx和Tokengateway

    az login az account set --subscription ${sub ID} az aks get-credentials --resource-group ${groupname} --name ${aks name} curl -LO https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.7.1/ingress-nginx-4.7.1.tgz sudo tar -xvf ingress-nginx-4.2.5.tgz sudo cd ingress-nginx #创建命名空间 kubectl create ns ingress-nginx-public # 使用

    2024年02月12日
    浏览(39)
  • Loki+Promtail+Grafana 监控 K8s 日志

    Loki 架构: 1、loki:服务端,负责存储日志和处理查询 2、promtail:采集端,负责采集日志发送给loki 3、grafana:负责采集日志的展示 创建 yaml 文件 cat loki-rbac.yaml cat loki-nodeport.yaml cat loki.yaml cat loki-configmap.yaml cat loki-promtail-rbac.yaml cat loki-promtail.yaml cat loki-promtail-configmap.yaml 2、创

    2024年02月16日
    浏览(41)
  • k8s日志收集组件 Grafana loki --- 理论篇

    当我们在k8s上运行程序时,习惯的会使用ELK来收集和查询程序运行日志。今天我们介绍一款新的专为日志收集而生的神器:Grafana loki。Grafana Loki 是一组组件,可以组合成一个功能齐全的日志堆栈。 与其他日志记录系统不同,Loki 仅构建索引有关日志的元数据:标签(就像 P

    2024年02月10日
    浏览(46)
  • Loki+Grafana(外)采集Kubernetes(K8s)集群(基于containerd)

    1、简介 Loki是一个开源、分布式的日志聚合系统,由Grafana Labs推出。Loki的设计目标是为了高效地处理大规模的日志数据,并具有良好的可扩展性。Loki的最大优点是它具有低资源占用和高效的查询速度。这是因为Loki不需要在处理日志数据时进行索引,而是将数据存储在类似于

    2024年02月10日
    浏览(43)
  • 使用kubeshpere创建k8s容器日志系统grafana-loki

    k8s日志聚合平台grafana-loki,可以统一查看所有容器的日志运行。 效果:  使用kubeshpere创建loki应用十分的方便,减少了很多操作,易用的同时也实用,k8s不再是精通人员才能使用的编排系统。 1、在企业空间中,添加bitnami应用仓库 https://charts.bitnami.com/bitnami  2、创建loki应用

    2024年02月12日
    浏览(46)
  • k8s集群使用ingress转发grafana服务

    在k8s集群中,使用ingress服务转发grafana的页面。 ingress方面增加路由规则和跨命名空间的service即可 grafana增加configmap挂载grafana.ini文件,增加匿名登陆配置和root_url配置 grafana.ini文件的yaml文件 grafana启动服务的yaml文件 我这里使用的pvc的存储类型是rook-ceph,使用其他存储类型的修

    2024年02月09日
    浏览(34)
  • k8s中部署nginx-ingress实现外部访问k8s集群内部服务

    k8s通过nginx-ingress实现集群外网访问功能 1.1 ingress 工作原理 step1:ingress contronler通过与k8s的api进行交互,动态的去感知k8s集群中ingress服务规则的变化,然后读取它,并按照定义的ingress规则,转发到k8s集群中对应的service。 step2:而这个ingress规则写明了哪个域名对应k8s集群中的

    2024年02月07日
    浏览(37)
  • K8S Nginx Ingress实现金丝雀发布

    通过给 Ingress 资源指定 Nginx Ingress 所支持的 annotation 可实现金丝雀发布。 需给服务创建2个 Ingress,其中 1个常规 Ingress , 另1个为带  nginx.ingress.kubernetes.io/canary: \\\"true\\\"  固定的 annotation 的 Ingress,称为 Canary Ingress。 Canary Ingress 一般代表新版本的服务,结合另外针对流量切分策

    2024年02月11日
    浏览(42)
  • 关于k8s中ingress、Gateway、nginx之间关系

    在Kubernetes中,Ingress是一种用于将外部流量路由到集群内部服务的API对象。它通常与Ingress控制器一起使用,Ingress控制器负责根据Ingress规则路由外部流量到不同的服务上。 下面是使用Ingress的一些步骤: 安装Ingress控制器 在Kubernetes中,Ingress控制器是需要安装和配置的。有许多

    2024年02月09日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包