博客/工程

Loki教程:如何在AWS EC2上设置Promtail来查找和分析日志

2020年7月13日7分钟

Amazon的弹性计算云(AWS EC2)是在云中运行应用程序的最流行的方法之一,但是为给定实例查找日志是一项常见的困难。洛基可以帮上忙。通过Loki聚合,您可以将所有虚拟机的所有日志分组到一个地方,通过它的搜索功能,您可以快速查找和分析它们。这是在云部署中获得可见性的好方法。

本教程解释如何设置Promtail代理在AWS EC2实例上进行配置,将其所有日志发送到Loki实例,这样就可以开始充分利用工作负载了。

需求

在我们开始之前,你需要:

  • AWS帐户(具有AWS_ACCESS_KEY而且AWS_SECRET_KEY).
  • VPC与internet之间路由可达。(遵循这些指令如果你需要创建一个。)
  • SSH公钥。(遵循这些指令如果你需要一个新的。)
  • AWS CLI配置(运行aws配置).
  • 一个已经配置了Loki数据源的Grafana实例。

为了简单起见,我们将使用一个Grafana Cloud Loki和Grafana实例,但如果运行自己的Loki和Grafana实例,所有步骤都是相同的。(你可以获得格拉芙娜云洛基的30天试用在这里.)

为了便于学习,下面所有的说明都是手动的。然而,在实际设置中,我们建议您使用配置工具,例如起程拓殖CloudFormationAnsible,或厨师

创建EC2实例

作为第一步,我们将把SSH密钥导入AWS,以便可以SSH到未来的EC2实例。让我们运行第一个命令:

Aws ec2 import-key-pair——key-name "promtail-ec2"——public-key-material fileb://~/.ssh/id_rsa.pub

接下来我们要创建一个安全组.请务必注意以下命令的组id:

aws ec2 create-security-group——group-name promtail-ec2——description "promtail on ec2"——vpc-id vpc-668d120f {"GroupId": " msg -02c489bbdeffdca1d"}

现在,让我们为SSH和授权入站访问Promtail服务器:

Aws ec2 authorization -security-group-ingress——group-id sg-02c489bbdeffdca1d——protocol TCP——port 22——cidr 0.0.0.0/0

你不需要对所有ip开放这些端口。如上所示,您可以使用自己的IP范围。

我们要创建一个亚马逊Linux 2实例,因为这是最流行的实例之一,但您可以随意使用您选择的AMI。

要创建实例,使用以下命令。请务必注意实例id:

Aws ec2 run-instances——image-id ami-016b213e65284e9c9——count 1——instance-type t2。Micro——key-name promtail-ec2——security-groups promtail-ec2

为了以后更有趣,让我们标记(Name = promtail-demo)我们的例子:

aws ec2 create-tags—resources i-041b0be05c2d5cfad—tags键=名称,值=promtail-demo

标签使您能够以不同的方式对AWS资源进行分类;例如,根据目的、所有者或环境。当您有许多相同类型的资源时,这是非常有用的—您可以根据分配给它的标记快速识别特定的资源。

最后,让我们获取实例的公共DNS:

aws ec2 description -instances——filters "Name=tag:Name,Values=promtail-demo"——query "Reservations[].Instances[].NetworkInterfaces[].Association.PublicDnsName"

并启动SSH会话:

ssh ec2 - user@ec2 13 - 59 - 62 - 37. - 2. -东- compute.amazonaws.com

设置Promtail

首先,让我们确保以根用户身份运行sudo - s

接下来我们将下载、安装并授予可执行权限Promtail

mkdir /opt/promtail && cd /opt/promtail curl -O -L "https://github.com/grafana/loki/releases/download/v1.5.0/promtail-linux-amd64.zip" unzip "promtail-linux-amd64.zip" chmod a+x "promtail-linux-amd64"

现在我们要下载promtail配置下面的文件和编辑。别担心,我们会解释它的意思。

卷曲https://raw.githubusercontent.com/grafana/loki/master/docs/clients/aws/ec2/promtail-ec2.yaml > ec2-promtail。Yaml vi ec2-promtail.yaml

服务器表示Promtail将把它的http服务器绑定到3100。Promtail提供HTTP页面,用于故障排除服务发现和目标。

客户部分允许你瞄准你的Loki实例。如果您正在使用Grafana Cloud,只需更换即可<用户名>而且api <秘密>凭你的证件。否则只需将整个URL替换为您的自定义Loki实例(例如,http://my-loki-instance.my-org.com/loki/api/v1/push).

Promtail使用相同的普罗米修斯scrape_configs.这意味着,如果您已经拥有一个Prometheus实例,那么配置将非常类似,并且很容易掌握。

因为我们在AWS EC2上运行,所以我们希望使用EC2服务发现。这将允许我们抓取关于当前实例的元数据(甚至您的自定义标记),并将它们附加到日志中。这样,对日志的管理和查询就容易得多了。

一定要更换相应的电流地区access_key而且secret_key;或者你也可以使用AWS的作用在攻击。有关这方面的更多信息,请参见ec2_sd_config文档

最后,relabeling_configs节有三个目的:

  1. 选择要附加到目标上的已发现标签。在我们的例子中即instance_id作为实例,标记的名字作为名字,和的实例。一定要去看看普罗米修斯号文档获取可用标签的完整列表。
  2. 选择Promtail应该在哪里找到日志。在我们的示例中,我们希望包含存在的所有日志文件/var/log使用glob/var/log/**.log.如果需要使用多个glob,则只需要添加另一个作业。
  3. 确保发现的目标只适用于Promtail当前运行的机器。这是通过添加标签实现的__host__使用传入元数据__meta_ec2_private_dns_name.如果它不匹配当前的HOSTNAME环境变量,目标将被删除。

好了,我们应该准备启动Promtail了!我们将使用旗帜运行它——即将.这是为了确保一切都是正确的,特别是当您仍然在处理配置时。使用此模式时不要担心;Promtail不会发送任何日志,并将记住任何文件位置。

。/ promtail-linux-amd64 -config.file =。/ ec2-promtail。yaml——管制

如果一切正常,你应该会看到一个日志指示行,它将被发送到Loki实例及其发现的标签,如下所示:

2020-07-08T14:51:38 {filename="/var/log/cloud-init.log", instance="i-041b0be05c2d5cfad", name="promtail-demo", zone="us-east-2c"} Jul 07 21:37:24 cloud-init[3035]: util.py[DEBUG]: loaded blob returned无,返回默认值。

如果你想查看现有的目标和可用的标签,你可以使用分配给你的实例的公共DNS到达Promtail服务器:

打开http://ec2 - 13 - 59 - 62 - 37. - 2. -东- compute.amazonaws.com: 3100 /

例如,下面的页面是服务发现页面。它将显示所有已发现的目标,以及它们各自的可用标签,如果有任何被删除,则显示原因。

将Promtail配置为服务

既然已经正确配置了Promtail,我们通常希望确保它作为systemd服务,因此它可以在失败时或实例重新启动时自动重新启动。

让我们使用vim /etc/systemd/system/promtail.service复制下面的服务定义:

[单位]Description=Promtail [Service] User=root WorkingDirectory=/opt/ Promtail / ExecStartPre=/bin/sleep 30 ExecStart=/opt/ Promtail / Promtail -linux-amd64——config.file=./ec2-promtail. exeyaml SuccessExitStatus=143 TimeoutStopSec=10 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target . yaml successsexitstatus =143 TimeoutStopSec=10 Restart=on-failure RestartSec=5

让我们重新加载systemd,启用,然后启动Promtail服务:

Systemctl daemon-reload Systemctl enable promtail。Service systemctl start promtail.service

可以使用如下命令验证服务是否正常运行:

Systemctl status promtail。服务-l●promtail。载入:载入(/etc/systemd/system/ Promtail .service;启用;Active: Active (running) since Wed 2020-07-08 15:48:57 UTC;主PID: 2732 (promtail-linux-) CGroup: /system.slice/promtail。服务├─2732 /opt/promtail/promtail-linux-amd64——config.file=./ec2-promtail. shyaml july 08 15:48:57 ip-172-31-45-69.us- eastern . computer .internal systemd[1]: Started Promtail。7月08日15:48:57 ip-172-31-45-69.us- eastern . computer .internal systemd[1]: Starting Promtail…7月08日15:48:57 ip-172-31-45-69 us-东部-2. computer .internal promtail-linux-amd64[2732]: level=warn ts=2020-07-08T15:48:57.559085451Z caller=filetargetmanager。: 98味精=“警告! !entry_parser config is deprecated, please change to pipeline_stages" july 08 15:48:57 ip-172-31-45-69.us-东-2. computer .internal promtail-linux-amd64[2732]: level=info ts=2020-07-08T15:48:57.559869071Z caller=server。go:179 http=[::]:3100 grpc=[::]:35127 msg="server listening on addresses" Jul 08 15:48:57 ip-172-31-45-69.us-east-2.compute.internal promtail-linux-amd64[2732]: level=info ts=2020-07-08T15:48:57.56029474Z caller=main.go:67 msg="Starting Promtail" version="(version=1.5.0, branch=HEAD, revision=12c7eab8)"

您现在可以在Grafana中验证Loki是否正确地接收了您的实例日志LogQL查询{区= " us-east-2 "}

EC2日志
EC2日志

发送systemd日志

就像我们对Promtail所做的一样,您很可能会使用systemd,通常用于存储应用程序的日志journald.Promtail实际上支持从journald,那么让我们来配置它。

我们将编辑之前的配置(vi ec2-promtail.yaml),并在scrape_configs部分。

- job_name: journal journal: json: false max_age: 12h path: /var/log/journal labels: job: system -journal relabel_configs: - source_labels: ['__journal__systemd_unit'] target_label: 'unit'

注意,您可以使用重新确认将systemd标签转换为您想要的。最后,确保日志日志的路径是正确的;在某些系统上可能有所不同。

下载最终的配置示例

就是这样!保存配置,然后就可以了重新启动机器(或简单地重新启动服务)Systemctl restart promtail.service).

让我们回到Grafana并验证您的Promtail日志在Grafana中可用LogQL查询{单位= " promtail.service "}在探索。最后,确保结账现场跟踪看到原木出现,因为他们被吞食洛基。