百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Loki最佳实践(译)

off999 2025-02-28 17:01 35 浏览 0 评论

本文参考《Loki labe best practice》,并结合小白实际的工作经验总结而来,不对的地方还请海涵。

1. 尽量使用静态标签

使用静态标签可以在日志时的开销更小。通常日志在发送到Loki之前,在注入label时,常见的推荐静态标签包含:

  • 物理机:kubernetes/hosts
  • 应用名:kubernetes/labels/app_kubernetes_io/name
  • 组件名:kubernetes/labels/name
  • 命名空间:kubernetes/namespace
  • 其他kubernetes/label/* 的静态标签,如环境、版本等信息

2. 谨慎使用动态标签

过多的标签组合会造成大量的流,它会让Loki存储大量的索引和小块的对象文件。这些都会显著消耗Loki的查询性能。为避免这些问题,在你知道需要之前不要添加标签!loki的优势在于并行查询,使用过滤器表达式( lable = "text", |~ "regex", …)来查询日志会更有效,并且速度也很快。

那么,我该什么时候添加标签?

chunk_target_size默认为1MB,loki将以1MB的压缩后大小来切割日志块,大约等于5MB的原始日志文件(根据你配置的压缩级别来决定)。如果在max_chunk_age时间内,你的日志流足以生成一个或者多个压缩块,那么你可以考虑添加标签,将日志流拆得更细一点。从Loki 1.4.0开始,有一个指标可以帮助我们了解日志块刷新的情况

sum by (reason) (rate(loki_ingester_chunks_flushed_total{cluster="dev"}[1m]))

3. 有界的标签值范围

不管怎样,到最后如果你不得不采用动态标签的话,那你也要注意控制标签的范围和value值的长度。举个例子,如果你想将nginx的访问日志提取一些字段后存储到loki,

{"@timestamp":"2020-09-30T12:16:07+08:00","@source":"172.16.1.1","hostname":"node1","ip":"-","client":"172.16.2.1","request_method":"GET","scheme":"https","domain":"xxx.com","referer":"-","request":"/api/v1/asset/asset?page_size=-1&group=23","args":"page_size=-1&group=23","size":975,"status": 200,"responsetime":0.065,"upstreamtime":"0.064","upstreamaddr":"172.16.3.1:8080","http_user_agent":"python-requests/2.22.0","https":"on"}

这里面@source代表客户端源地址,由于源地址是公网地址,那么在建立loki标签时它的值就是个无界的。 再比如这里面@request代表请求URL。可能存在某些请求参数过长,loki的标签值也会过大。如果再将两者相乘,那么这个标签的规模是无法接受的。

以上这种情况是比较属于典型无界的动态标签值,在loki里面我们用Cardinality来表述它,Cardinality值越高,loki的查询效率越低。。Loki社区给出动态标签的范围应尽量控制在10以内

4. 客户端应用的动态标签

Loki的几个客户端(Promtail、Fluentd,Fluent Bit,Docker插件等)都带有配置标签来创建日志流的方法。我们有时需要在loki里面去排查哪些应用使用了动态标签,这时候我们可以用logcli工具来辅助我们。在Loki1.6.0及更高版本中,logcli series命令添加了--analyze-labels参数专门用于调试高cardinality的标签。例如:

$ logcli series --analyze-labels '{app="nginx"}'

Total Streams:  25017
Unique Labels:  8

Label Name  Unique Values  Found In Streams
requestId   24653          24979
logStream   1194           25016
logGroup    140            25016
accountId   13             25016
logger      1              25017
source      1              25016
transport   1              25017
format      1              25017

可以看到这里面requestId这个标签就有24653个值,这是非常不好的。我们应该将requestId从label里面去删除,通过这种方式查询

{app="nginx"} |= "requestId=1234567"

5. 配置缓存

关于loki的缓存,可以参考小白之前的文章《巧用缓存加速Loki查询》

缓存在Loki的应用比较灵活,你可以让loki所有组件公用一个缓存,也可以让每个loki组件单独使用自己的缓存,具体可以参考小白前面关于loki分布式部署的相关文章

6. 日志的时间必须顺序递增

对于一个日志流里面出现时间戳早于该流收到的最新日志,那么这条日志将被删除

{job=”syslog”} 00:00:00 i’m a syslog!
{job=”syslog”} 00:00:02 i’m a syslog!
{job=”syslog”} 00:00:01 i’m a syslog! \\这条日志会被删除

如果你的服务是分布式跑在多个节点上,而且存在时间差的话,那你只有为这类日志添加新的标签来存储了

{job=”syslog”, instance=”host1”} 00:00:00 i’m a syslog!  \\新日志流1
{job=”syslog”, instance=”host1”} 00:00:02 i’m a syslog!
{job=”syslog”, instance=”host2”} 00:00:01 i’m a syslog!  \\新日志流2
{job=”syslog”, instance=”host1”} 00:00:03 i’m a syslog!  \\在日志流1里时间有序
{job=”syslog”, instance=”host2”} 00:00:02 i’m a syslog!  \\在日志流2里时间有序

这个没啥好说的,小白建议日志采集时按照客户端的时间为每条日志添加时间戳。如果你的时间戳是从应用日志里面提取出来,并且出现时间乱序的话,那还是请你先解决应用的问题

7. 使用chunk_target_size参数

上文说到chunk_target_size可以有效的将日志流压缩到一个合理的空间大小,Loki中每个日志流都包含一个块。如果我们将日志文件分解成更多的流,内存中存储的块就越多,在被刷新到磁盘之前,理论上来说都有丢日志的风险。那么这个时候就需要组合max_chunk_age默认1h和chunk_idle_period默认30m,来控制日志刷新的超时时间。

8. 使用-print-config-stderr或-log-config-reverse-order参数

从1.6.0版开始,Loki和Promtail支持这类参数,当启动时,loki会把整个配置信息打印到stderr或日志文件中。,这样我们可以快速看到整个Loki配置,便于调试。

当这个参数-log-config-reverse-order启用时,我们在grafna上查询loki时将以顺序的方式查看日志,这个可以让我们更加方便一点。

9. 使用query-frontend

query-frontend可以有效的将日志查询拆分成多个小查询分发给querier去并发执行。这件极大的提高loki的查询效率,理论上来说你可以扩容上百个querier去并发处理GB或者TB级别的日志,不过前提是你的查询客户端能够容得下这些日志。

关于云原生小白

云原生小白的创号目的是将平日里离大家较远云原生应用以实用的角度展现出来,站在小白的角度来看待和使用云原生,并以每篇文章解决一个实际问题的出发点带领大家走进云原生。

相关推荐

android模拟器下载安装(安卓模拟器软件下载)

电脑版安卓模拟器可以通过网上下载并安装。首先选择一个安卓模拟器,比如NoxPlayer、BlueStacks、LDPlayer等,然后在官网或其他可靠的下载网站下载对应的安装包。下载完成后,双击安装包...

win7明明是管理员却没有权限

答:win7没有管理员权限的解决方法。1.为Windows7的右键菜单添加取得所有权的菜单:具体实现的方法不难,将以下内容另存为文本文件; 2.然后修改该文件的扩展名为.reg,双击导...

电脑c盘格式化了怎么装系统(电脑c盘格式化后还能用吗)

C盘只有格式化才能中心装系统吗?不是的。C盘格式化是为了让C盘更清洁,这样装了的系统比较纯净的。没有系统来及,用起来更是的速度快。格式化(format)是指对磁盘或磁盘中的分区(partition)进...

win10开机慢怎么设置(win 10开机太慢)
  • win10开机慢怎么设置(win 10开机太慢)
  • win10开机慢怎么设置(win 10开机太慢)
  • win10开机慢怎么设置(win 10开机太慢)
  • win10开机慢怎么设置(win 10开机太慢)
手机路由器管理(手机路由器管理界面进不去是什么原因)
  • 手机路由器管理(手机路由器管理界面进不去是什么原因)
  • 手机路由器管理(手机路由器管理界面进不去是什么原因)
  • 手机路由器管理(手机路由器管理界面进不去是什么原因)
  • 手机路由器管理(手机路由器管理界面进不去是什么原因)
佳能(中国)官网下载(佳能(中国)官网下载appstore)

需要先进入佳能官网的下载页面,选择手机APP下载选项,根据手机操作系统的不同选择相应的下载链接即可成功下载佳能手机APP。下载链接通常会在网站的首页或者是产品页面上提供。总的来说,下载佳能手机APP非...

c盘右边有个恢复分区怎么删除

1、从网上下载“分区助手专业6.2(或5.6)”,它能无损分区,下载后打开按提示安装,点击分区助手桌面快捷方式图标,打开分区助手专业版6.2主界面。2、右击要调出空间的分区,如E,选“分配自由空间”,...

电脑插着电源却不充电怎么办

电脑插上电源但无法充电可能有以下原因:1.电池没有完全安装,需要检查电池是否完全插入笔记本电脑中。2.电池损坏,如果电池老化或发生机械故障、磨损和损伤,充电电流将会被阻塞从而无法进行充电,需要更换...

如何格式化手机(华为p50如何格式化手机)
如何格式化手机(华为p50如何格式化手机)

步骤/方式1软件格式化:利用psiloc公司的软件sTools,进行格式化手机,锁码为12345步骤/方式2软格:在手机上输入*#7370#之后要求你输入锁码,初始密码是:12345步骤/方式3硬格:先关机,再开机的时候按住拨号键、“*...

2025-12-17 12:03 off999

win10自动更新的禁用方法(win10自动更新的禁用方法是什么)

方法一:Windows设置  要想关闭Win10自动更新,比较简单的一种方法就是进入到Windows设置中,将Windows更新直接关闭。步骤如下:  1、按“Windows+I”键,打开Wind...

优化win7系统运行速度(优化win7系统运行速度多少)

优化WIN7系统开机启动项的操作方法1、在桌面上按组合键(win键+R)打开运行窗口,接着输入“regedit”,回车确认,2、打开注册表编辑器后,我们依次点击展开“HKEY_CURRENT_USE...

win7设置每天自动开机时间(win7设置每天自动开机时间任务)

要在Windows7上设置每天自动开关机,您可以按照以下步骤操作:1.打开“控制面板”,单击“系统和安全”,然后选择“计划任务”。2.单击“创建基本任务”,输入一个适合您的任务名称,并添加相应的...

苹果电脑装双系统好用吗(苹果电脑安装双系统会不会对电脑不好)

好处:1、可以在保留原来的系统上再安装一个新系统,两个系统互不干扰,可以互相切换,使用方便。2、双系统可以在不用环境系进行软件调试没测试电脑的兼容性。3、双系统可以让用户体验不同的系统功能,提高用户的...

qq好友恢复网站官方网站(qq好友恢复官方网站为什么不能用)
  • qq好友恢复网站官方网站(qq好友恢复官方网站为什么不能用)
  • qq好友恢复网站官方网站(qq好友恢复官方网站为什么不能用)
  • qq好友恢复网站官方网站(qq好友恢复官方网站为什么不能用)
  • qq好友恢复网站官方网站(qq好友恢复官方网站为什么不能用)
在电脑上复制粘贴按什么键(电脑怎复制粘贴按那个键)

电脑键盘上的“复制和粘贴”,分别是Ctrl+c和Ctrl+v,其中复制的快捷键是Ctrl+c,粘贴的快捷键是Ctrl+v。鼠标右键,点击右键会出菜单,移动光标后点击左键确认。键盘复制的快捷键:Ctrl...

取消回复欢迎 发表评论: