Kong 可观测性最佳实践

Kong 介绍

Kong 是一个云原生、高效、可扩展的分布式 API 网关,基于 Nginx 和 OpenResty 构建。它旨在为现代微服务架构提供高性能、高可用的 API 托管服务。

Kong 代理 HTTP 请求,根据 HTTP 主机头、请求 URI 和请求方式(GET/POST 等)匹配路由规则,找到实际处理请求的后端服务。Kong 的插件机制允许在请求/响应生命周期中执行自定义逻辑,这些插件可以处理请求、定义 API、操作数据库等。

架构和组件

  • Kong Server:基于 Nginx 的服务器,用来接收 API 请求。
  • 数据存储:使用 Apache Cassandra 或 PostgreSQL 来存储操作数据。
  • Kong Dashboard:官方推荐的 UI 管理工具,也可以使用 RESTful API 进行管理。

Kong 适用于需要高性能、高可用 API 管理的微服务架构,特别是在需要处理大量请求和复杂认证、限流等需求的场景中。它可以帮助开发人员和运维人员更好地管理和保护 API,提供统一的入口点和流量控制机制。

观测云

观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。

部署 DataKit

DataKit 是一个开源的、跨平台的数据收集和监控工具,由观测云开发并维护。它旨在帮助用户收集、处理和分析各种数据源,如日志、指标和事件,以便进行有效的监控和故障排查。DataKit 支持多种数据输入和输出格式,可以轻松集成到现有的监控系统中。

登录观测云控制台,在「集成」 - 「DataKit」选择对应安装方式,当前采用 Linux 主机部署 DataKit。

Kong 插件配置

Kong 开启 Prometheus 插件

Kong 需要开启 Prometheus 插件后,方可上报指标数据,这里建议采用全局的方式进行配置,可参考 Kong 官方文档,可以通过以下两种方式进行配置(二选一)。

1、通过 Kong Manager 进行配置

登录 Kong Manager ,点击 Plugins 菜单,新增 Prometheus。

2、通过 Kong API 进行配置

复制代码
curl -X POST http://localhost:8001/plugins \
    --header "accept: application/json" \
    --header "Content-Type: application/json" \
    --data '
    {
  "name": "prometheus",
  "config": {
    "per_consumer": true,
    "status_code_metrics" : true,
    "bandwidth_metrics": true
  }
}'
Kong 开启 Logging 插件

Kong 支持多种 Logging 插件,这里主要采用 TCP Log 插件上报日志数据。

1、通过 Kong Manager 进行配置

登录 Kong Manager ,点击 Plugins 菜单,新增 TCP Log。

参数说明:

  • host:DataKit host
  • port: DataKit 日志 socket 端口

2、通过 Kong API 进行配置

复制代码
curl -X POST http://localhost:8001/plugins \
    --header "accept: application/json" \
    --header "Content-Type: application/json" \
    --data '
    {
  "name": "tcp-log",
  "config": {
    "port": 9580,
    "host" : "<datakit-host>"
  }
}'

采集器配置

开启 Prom 采集器

Prom 采集器用于 Prometheus 格式的指标数据采集。

  • 进入 datakit 安装目录下的 conf.d/prom 目录,复制 prom.conf.sample 并命名为 kong.conf

    cp prom.conf.sample kong.conf

  • 调整 kong.conf

只需调整以下两个参数,其他保持不变:

复制代码
[[inputs.prom]]
  ## Exporter URLs.
  urls = ["http://127.0.0.1:8001/metrics"]
  keep_exist_metric_name = true
开启日志采集器
  • 进入 datakit 安装目录下的 conf.d/log 目录,复制 logging.conf.sample 并命名为 kong-socket.conf

    cp logging.conf.sample kong-socket.conf

  • 调整 kong-socket.conf

可用以下全文替换:

复制代码
# {"version": "1.22.0", "desc": "do NOT edit this line"}

[[inputs.logging]]
  ## Required
  ## File names or a pattern to tail.

  # Only two protocols are supported:TCP and UDP.
  sockets = [
     "tcp://0.0.0.0:9580",
  #  "udp://0.0.0.0:9531",
  ]
  ## glob filteer
  ignore = [""]

  ## Your logging source, if it's empty, use 'default'.
  source = "kong_tcp_log"

  ## Add service tag, if it's empty, use $source.
  service = ""

  ## Grok pipeline script name.
  pipeline = ""

  ## optional status:
  ##   "emerg","alert","critical","error","warning","info","debug","OK"
  ignore_status = []

  ## optional encodings:
  ##    "utf-8", "utf-16le", "utf-16be", "gbk", "gb18030" or ""
  character_encoding = ""

  ## The pattern should be a regexp. Note the use of '''this regexp'''.
  ## regexp link: https://golang.org/pkg/regexp/syntax/#hdr-Syntax
  # multiline_match = '''^\S'''

  auto_multiline_detection = true
  auto_multiline_extra_patterns = []

  ## Removes ANSI escape codes from text strings.
  remove_ansi_escape_codes = false

  ## If the data sent failure, will retry forevery.
  blocking_mode = true

  ## If file is inactive, it is ignored.
  ## time units are "ms", "s", "m", "h"
  ignore_dead_log = "1h"

  ## Read file from beginning.
  from_beginning = false

  [inputs.logging.tags]
  # some_tag = "some_value"
  # more_tag = "some_other_value"

开启 Pipeline

Pipeline 可用于日志的字段提取,kong 通过 tcp-log 上报 json 格式的日志。

解析规则如下:

复制代码
kong_log_json = load_json(_)

add_key("url", kong_log_json["request"]["url"])
add_key("uri", kong_log_json["request"]["uri"])
add_key("method", kong_log_json["request"]["method"])
add_key("code", kong_log_json["response"]["status"])

add_key("kong_route", kong_log_json["route"]["name"])
add_key("kong_service", kong_log_json["service"]["name"])
add_key("client_ip", kong_log_json["client_ip"])
add_key("trace_id", kong_log_json["request"]["headers"]["traceparent"])
grok(trace_id, "%{DATA}-%{DATA:trace_id}-%{DATA}") 

add_key("status", "ok")

也可以按照实际需求进行增删处理。

关键指标

采集上来的指标存储在 kong 指标集中,相关指标如下:

指标名 单位 描述
kong_bandwidth_bytes bytes Kong的带宽使用量,单位为字节
kong_datastore_reachable - 数据存储是否可达的状态指标
kong_http_requests_total count HTTP请求的总数
kong_kong_latency_ms_bucket ms Kong自身延迟的直方图桶,单位为毫秒
kong_kong_latency_ms_count count Kong自身延迟的计数
kong_kong_latency_ms_sum ms Kong自身延迟的总和,单位为毫秒
kong_latency_ms_bucket ms 请求延迟的直方图桶,单位为毫秒
kong_latency_ms_count count 请求延迟的计数
kong_latency_ms_sum ms 请求延迟的总和,单位为毫秒
kong_memory_lua_shared_dict_bytes bytes Lua共享字典使用的内存,单位为字节
kong_memory_lua_shared_dict_total_bytes bytes Lua共享字典总内存,单位为字节
kong_memory_workers_lua_vms_bytes bytes 工作进程中的Lua虚拟机使用的内存,单位为字节
kong_nginx_connections_total count Nginx连接的总数
kong_nginx_metric_errors_total count Nginx指标错误的总数
kong_nginx_requests_total count Nginx请求的总数
kong_node_info - 节点信息
kong_request_latency_ms_bucket ms 请求延迟的直方图桶,单位为毫秒
kong_request_latency_ms_count count 请求延迟的计数
kong_request_latency_ms_sum ms 请求延迟的总和,单位为毫秒
kong_upstream_latency_ms_bucket ms 上游延迟的直方图桶,单位为毫秒
kong_upstream_latency_ms_count count 上游延迟的计数
kong_upstream_latency_ms_sum ms 上游延迟的总和,单位为毫秒

场景视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 "Kong", 选择 "Kong 监控视图" 或者 "Kong API 监控视图",点击 "确定" 即可添加视图。

监控器(告警)

Kong 数据存储不可达

简要描述:当 Kong 的数据存储不可达时,可能是因为配置错误、数据库问题或网络连接问题。

Kong 请求响应延迟过高

简要描述:Kong 请求响应延迟过高可能由多种原因导致,包括配置问题、后端服务性能瓶颈、网络问题或插件执行效率低下等,当延迟过高时,需要及时进行排查,以免影响更多的用户。

总结

通过观测云统一监控 Kong 指标、日志记录等功能,全面了解和管理 Kong API 网关的运行状态和性能表现。

相关推荐
天草二十六_简村人7 天前
微信小程序的业务域名配置(通过ingress网关的注解)
后端·微服务·微信小程序·小程序·k8s·kong
天草二十六_简村人16 天前
kong搭建一套微信小程序的公司研发环境
java·后端·微信小程序·小程序·kong
你的代码我的心1 个月前
docker下部署kong+consul+konga 报错问题处理
docker·kong·consul
summer_west_fish2 个月前
Kong故障转移参数配置
网络·kong
张声录12 个月前
centos 7.x无法安装kong gateway 3.9X的解决方案
centos·gateway·kong
张声录12 个月前
【kong gateway】5分钟快速上手kong gateway
gateway·kong
张声录12 个月前
【Kong Gateway】全面解析Kong Gateway:服务、路由、upstream、插件的核心概念介绍
网络·gateway·kong
张声录12 个月前
kong 网关和spring cloud gateway网关性能测试对比
kong
等一场春雨3 个月前
window11 wsl mysql8 错误分析:1698 - Access denied for user ‘root‘@‘kong.mshome.net‘
android·kong