;客户;λPromtail

λPromtail

Grafana Loki包括起程拓殖而且CloudFormation将Cloudwatch和loadbalancer日志通过一个lambda函数.这是通过lambda-promtail哪个处理cloudwatch事件和传播他们到Loki(或Promtail实例)通过push-api刮配置

部署

Lambda-promtail可以通过provider轻松部署起程拓殖而且CloudFormation文件。terrform部署还从中获取定义的变量值variables.tf

对于这两种部署类型,都必须定义几个值:

  • 写地址,一个Loki写API兼容的端点(Loki或Promtail)
  • 如果写地址是Loki端点并具有身份验证,则基本身份验证用户名/密码
  • lambda-promtail图像,完整的ECR回购路径:标签

同时采用阵列形式的日志组和桶名,也可以采用阵列形式的VPC子网和安全组。

当从Cloudwatch传播日志时,还有一个保持日志流标签的标志,默认为false。当基数太大时,例如每个lambda调用都有一个日志流时,这可能很有帮助。

此外,可以配置一个环境变量,向lambda-protmail的日志流添加额外的标签。这些额外的标签将采取的形式__extra_ <名称> = <值>

可以配置一个可选的环境变量,将租户ID添加到lambda-protmail的日志流中。

为了使lambda-promtail的部署尽可能简单,我们创建了一个公开ECR回购发布lambda-promtail的构建。用户可以克隆这个回购,对Go代码进行自己的修改,并上传自己的图像到自己的ECR回购。

例子

起程拓殖:

Terraform apply -var "lambda_promtail_image=" -var "write_address=https://logs-prod-us-central1.grafana.net/loki/api/v1/push" -var "password=" -var "username=" -var 'log_group_names=["/aws/lambda/log-group-1", "/aws/lambda/log-group-2"]' -var 'bucket_names=["bucket-a", "bucket-b"]' -var 'batch_size=131072'

的前几行main.tf定义要部署到的AWS区域。根据需要进行修改,或删除并部署到

提供程序"aws" {region = "us-east-2"}

保持日志组标签addvar“keep_stream = true”

要添加额外的标签,请添加var ' extra_labels =“name1, value1, name2 value2”

添加租户id addvar“tenant_id =值”

注意,在提供的terrform文件中创建Cloudwatch上的订阅过滤器只接受一个日志组名数组。它接受通过订阅过滤器对日志内容进行正则表达式过滤的字符串。我们建议扩展terrform文件来实现此目的。或者,让lambda-promtail写入Promtail并使用管道阶段

CloudFormation:

Aws cloudformation create-stack——stack-name lambda-promtail——template-body file://模板。yaml——capabilities capacity_iam capacity_named_iam——region us- east_iam——parameters ParameterKey=WriteAddress,ParameterValue=https://logs-prod-us-central1.grafana.net/loki/api/v1/push ParameterKey=Username,ParameterValue= ParameterKey=Password,ParameterValue=< Password > ParameterKey=LambdaPromtailImage,ParameterValue=

在CloudFormation模板文件中,根据需要对每个日志组复制、粘贴和修改订阅筛选器部分:

MainLambdaPromtailSubscriptionFilter:类型:AWS::Logs::SubscriptionFilter属性:DestinationArn: !Arn FilterPattern: "" LogGroupName: "/aws/lambda/some- lambda -log-group"

若要保留日志组标签,请添加ParameterKey = KeepStream ParameterValue = true

要添加额外的标签,请使用includeParameterKey = ExtraLabels ParameterValue = " name1 value1, name2, value2”

要添加租户ID,请添加ParameterKey = TenantID ParameterValue =价值

要修改现有的CloudFormation堆栈,请使用update-stack

使用

短暂的工作

该工作流旨在成为一种有效的方法,用于监视诸如在AWS Lambda上运行的临时性作业,否则很难/不可能通过其他Loki之一监视这些作业客户

临时作业很容易与基数最佳实践相冲突。在高请求负载期间,AWS lambda函数可能在并发性中膨胀,在Cloudwatch中创建许多日志流。因此,lambda-promtail默认为在将日志传播到Loki时,将日志流值保留为一个标签。这是可能的,因为Loki的新版本不再对单个流中的日志有摄入顺序约束。

洛基部署的概念证明

对于那些使用Cloudwatch并希望以低风险的方式测试Loki的人来说,这个工作流允许将Cloudwatch日志传输到Loki,而不考虑事件源(EC2、Kubernetes、Lambda、ECS等),而无需在他们的基础设施中设置一组Promtail守护进程。但是,从长远来看,从灵活性、可靠性、性能和成本方面考虑,在基础设施上作为守护进程运行Promtail是最佳实践部署策略。

注意:从Cloudwatch传播日志到Loki意味着您仍然需要这样做支付监测。

loadbalance日志

该工作流程允许将存储在S3上的AWS loadbalancer日志输入到Loki。

Cloudfront实时日志

Cloudfront实时日志可以发送到一个Kinesis数据流。数据流可以映射为事件源让朗达-普罗泰尔把日志交给洛基

传播品牌

传入的日志可以有分配给它们的七个特殊标签,这些标签可以用于重新确认或Promtail的后期阶段管道

  • __aws_log_type:这个日志来自哪里(Cloudwatch, Kinesis或S3)。
  • __aws_cloudwatch_log_group:与此日志相关的Cloudwatch日志组。
  • __aws_cloudwatch_log_stream:此日志的相关Cloudwatch日志流(如果KEEP_STREAM = true).
  • __aws_cloudwatch_owner:该事件所有者的AWS ID。
  • __aws_kinesis_event_source_arn:运动学事件源ARN。
  • __aws_s3_log_lb: loadbalancer的名称。
  • __aws_s3_log_lb_owner: loadbalancer所有者的Account ID。

限制

Promtail标签

注意:如果在lambda-promtail和Loki部署之间运行Promtail并用于规避,则此节与此相关故障在取消了订购约束的v2.4 Loki版本之前的问题。

如前所述,此工作流将最坏情况流基数从number_of_log_streams->number_of_log_groupsnumber_of_promtails.因此,每个Promtail必须有一个唯一的标签附加到它所处理的日志上(理想情况下是通过类似于——client.external-labels = promtail = ${主机名}),根据吞吐量和冗余需求,建议在负载均衡器后面运行少量的promtail。

当您有大量日志流,但希望按日志组聚合它们时,这种权衡非常有效。这在AWS Lambda中非常常见,其中日志组是“应用程序”,而日志流是独立的应用程序容器,可以随意上下旋转,可能只用于单个函数调用。

数据持久性

可用性

出于可用性考虑,在负载平衡器后面运行一组promtail。

批处理

如果将lambda-promtail配置为写入Promtail,则与此相关。由于Promtail批量写入Loki以获得性能,因此Promtail可能会收到一个日志,发出一个成功的204http的写状态码,然后在稍后的时间写入上游到Loki之前被杀死。这种情况应该很少发生,但这是该工作流的一个缺点。

的默认值时,此lambda将刷新日志131072(128KB),这可以通过BATCH_SIZE环境变量,该变量设置为要使用的字节数。

模板/部署

当前的CloudFormation模板是初级的。如果你需要添加vpc配置,额外的日志组监控,子网声明等,你需要手动编辑模板。如果您需要订阅多个Cloudwatch日志组,您还需要为每个组复制粘贴模板的该部分。

terrform文件更加充实,可以配置为接收日志组和桶名的数组,以及vpc配置。

提供的terrform和CloudFormation文件旨在覆盖默认用例,更复杂的部署可能需要对提供的文件进行一些修改和扩展。

使用实例Promtail配置

注意:这应该与附加的promtail特定的标签一起运行,理想情况下是通过类似于——client.external-labels = promtail = ${主机名}.它将通过端口上的push-api接收写操作3500(http)和3600(grpc)。

Server: http_listen_port: 9080 grpc_listen_port: 0 locations: filename: /tmp/ locations。yaml clients:—url: http://ip_or_hostname_where_Loki_run:3100/loki/api/v1/push scrape_configs:—job_name: push1 loki_push_api: server: http_listen_port: 3500 grpc_listen_port: 3600 labels: #在所有流上添加一个标签,表明它被lambda-promtail工作流处理过。relabel_configs: - source_labels: ['__aws_log_type'] target_label: 'log_type' #将cloudwatch日志组映射到Loki中使用的名为' log_group '的标签中。- source_labels: ['__aws_cloudwatch_log_group'] target_label: 'log_group' #将loadbalancer名称映射到一个名为' loadbalancer_name '的标签中,用于Loki。- source_label: ['__aws_s3_log_lb'] target_label: 'loadbalancer_name'

多Promtail部署

免责声明:以下部分仅与不能接受故障日志的较老版本Loki相关。

然而,这些可能只在很短的一段时间内有效。这为在Loki中组合这些短期日志流带来了一个问题,因为时间戳可能不会严格地跨多个日志流增加。另一种明显的方法是基于日志流创建标签,这也是不可取的,因为它通过许多低吞吐量的日志流导致基数问题。

相反,我们可以将Cloudwatch日志输送到一组promtail,这可以从两方面缓解这些问题:

  1. 使用Promtail的push api和use_incoming_timestamp:假config中,我们让Promtail根据它接收日志的时间戳来确定时间戳,而不是cloudwatch分配的时间戳。显然,这意味着我们丢失了原始时间戳,因为Promtail现在分配了它,但在这样的实时摄入系统中,这是一个相对较小的差异。
  2. 与(1)相结合,Promtail可以跨Cloudwatch日志流合并日志,因为在组合多个源(lambda调用)时,它不再容易出现乱序错误。

当在负载平衡器后面运行一组promtail时,要记住的一个重要方面是,我们有效地将基数问题从日志流的数量—> promtail的数量转移。如果你还没有配置洛基接受乱序写入,您需要为每个Promtail分配一个特定于Promtail的标签,以便在Promtail将相同日志组的数据发送给Loki时不会出现无序错误。这可以通过类似于——client.external-labels = promtail = ${主机名}传给Promtail。