一、背景引入

在咱们日常的开发和运维工作里,实时监控业务状态、及时发现问题并告警可是非常重要的事儿。Openresty 作为一个强大的 Web 平台,它能把 Nginx 和 Lua 结合起来,让咱们开发高性能的 Web 应用变得轻松不少。不过,要想真正掌握业务的运行状况,就得对 Openresty 产生的日志进行采集和分析。而 Elasticsearch 是一个分布式的搜索和分析引擎,它能快速地存储、搜索和分析大量的数据。把 Openresty 日志采集和 Elasticsearch 结合起来,就能实现实时业务监控与告警啦。

二、Openresty 日志采集

2.1 日志格式配置

Openresty 可以通过配置日志格式来记录我们需要的信息。在 Nginx 配置文件里,我们可以这样设置日志格式:

# Nginx 技术栈
# 设置自定义日志格式,包含请求的时间、请求方法、请求 URI、响应状态码等信息
log_format custom '$time_local $remote_addr "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
# 指定访问日志使用自定义的日志格式
access_log /var/log/nginx/access.log custom;

这里我们定义了一个名为 custom 的日志格式,记录了请求的时间、客户端地址、请求信息、响应状态码等内容。然后把访问日志指定为使用这个自定义格式。

2.2 日志采集工具

为了采集 Openresty 的日志,我们可以使用 Filebeat。Filebeat 是一个轻量级的日志采集器,它可以监控日志文件的变化,把新产生的日志发送到 Elasticsearch 里。

首先,我们要安装 Filebeat。以 Ubuntu 系统为例:

# 下载并安装 Filebeat
wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.3-amd64.deb
sudo dpkg -i filebeat-7.17.3-amd64.deb

接着,我们要配置 Filebeat 来采集 Openresty 的日志:

# Filebeat 配置文件
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/nginx/access.log  # 指定要采集的日志文件路径
output.elasticsearch:
  hosts: ["localhost:9200"]  # 指定 Elasticsearch 的地址

在这个配置里,我们指定了要采集的日志文件路径是 /var/log/nginx/access.log,然后把采集到的日志发送到本地的 Elasticsearch 服务(地址是 localhost:9200)。

三、Elasticsearch 存储与分析

3.1 数据存储

Elasticsearch 是基于文档的数据库,它把数据以 JSON 文档的形式存储。当 Filebeat 把 Openresty 的日志发送到 Elasticsearch 后,Elasticsearch 会自动创建索引来存储这些日志数据。

3.2 数据查询与分析

我们可以使用 Elasticsearch 的查询 API 来查询和分析日志数据。比如,我们想查询状态码为 500 的请求:

# Elasticsearch 查询示例
{
  "query": {
    "term": {
      "status": "500"  # 查询状态码为 500 的记录
    }
  }
}

这个查询会返回所有状态码为 500 的日志记录。我们还可以使用 Elasticsearch 的聚合功能来进行数据分析。比如,统计每个小时的请求数量:

# Elasticsearch 聚合查询示例
{
  "aggs": {
    "requests_per_hour": {
      "date_histogram": {
        "field": "@timestamp",  # 按照时间戳字段进行分组
        "interval": "hour"  # 按小时分组
      }
    }
  }
}

这个聚合查询会把日志数据按照每小时进行分组,统计每个小时的请求数量。

四、实时业务监控与告警

4.1 监控指标设置

我们可以根据业务需求设置一些监控指标,比如请求响应时间、请求成功率等。以请求响应时间为例,我们可以设置一个阈值,当平均响应时间超过这个阈值时就触发告警。

4.2 告警机制

为了实现告警功能,我们可以使用 Elasticsearch 的 Alerting 功能。首先,我们要创建一个监控任务:

# Elasticsearch 监控任务配置
{
  "name": "Response Time Monitor",
  "type": "monitor",
  "schedule": {
    "interval": "5m"  # 每 5 分钟执行一次监控任务
  },
  "inputs": [
    {
      "search": {
        "request": {
          "indices": ["nginx_access_log"],  # 指定要查询的索引
          "body": {
            "query": {
              "match_all": {}
            },
            "aggs": {
              "avg_response_time": {
                "avg": {
                  "field": "response_time"  # 计算响应时间的平均值
                }
              }
            }
          }
        }
      }
    }
  ],
  "triggers": [
    {
      "name": "High Response Time",
      "condition": {
        "script": {
          "source": "ctx.results[0].aggregations.avg_response_time.value > 1000",  # 当平均响应时间超过 1000 毫秒时触发告警
          "lang": "painless"
        }
      },
      "actions": [
        {
          "name": "Send Email",
          "throttle_period": "1h",  # 每小时只发送一次告警邮件
          "email": {
            "profile": "standard",
            "to": ["admin@example.com"],  # 告警邮件接收地址
            "subject": "High Response Time Alert",
            "body": "The average response time has exceeded 1000 milliseconds."
          }
        }
      ]
    }
  ]
}

在这个配置里,我们创建了一个监控任务,每 5 分钟执行一次。它会查询 nginx_access_log 索引,计算响应时间的平均值。当平均响应时间超过 1000 毫秒时,就会触发告警,给 admin@example.com 发送一封告警邮件。

五、应用场景

5.1 性能监控

通过对 Openresty 日志的采集和分析,我们可以实时监控应用的性能。比如,我们可以分析请求的响应时间、吞吐量等指标,找出性能瓶颈,及时进行优化。

5.2 安全监控

日志里包含了很多安全相关的信息,比如异常的请求、非法的访问等。通过分析这些日志,我们可以及时发现安全问题,采取相应的措施。

5.3 业务分析

我们可以根据日志数据来分析业务的运行情况,比如用户的行为习惯、业务的热门功能等。这些信息可以帮助我们更好地优化业务。

六、技术优缺点

6.1 优点

  • 实时性:Elasticsearch 可以快速地存储和分析数据,实现实时监控和告警。
  • 扩展性:Elasticsearch 是分布式的,可以轻松地扩展集群规模,处理大量的日志数据。
  • 灵活性:Elasticsearch 提供了强大的查询和分析功能,可以根据不同的需求进行定制化的分析。

6.2 缺点

  • 资源消耗:Elasticsearch 需要较多的系统资源,尤其是在处理大量数据时。
  • 学习成本:Elasticsearch 的查询语法和配置比较复杂,需要一定的学习成本。

七、注意事项

7.1 日志格式统一

在配置 Openresty 日志格式时,要保证日志格式的统一,这样才能方便后续的分析。

7.2 数据安全

日志数据包含了很多敏感信息,要注意数据的安全,比如对日志文件进行加密、限制访问权限等。

7.3 性能优化

在处理大量日志数据时,要注意 Elasticsearch 的性能优化,比如合理设置索引、优化查询语句等。

八、文章总结

通过把 Openresty 日志采集和 Elasticsearch 结合起来,我们可以实现实时业务监控与告警。Openresty 负责产生日志,Filebeat 负责采集日志,Elasticsearch 负责存储和分析日志。我们可以根据业务需求设置监控指标和告警机制,及时发现业务中的问题。不过,在使用这个技术方案时,我们要注意日志格式统一、数据安全和性能优化等问题。