【发布时间】:2020-10-21 06:15:26
【问题描述】:
我正在运行一个普通的 AWS lambda 函数来计算我的 RabbitMQ 任务队列中的消息数量:
import boto3
from botocore.vendored import requests
cloudwatch_client = boto3.client('cloudwatch')
def get_queue_count(user="user", password="password", domain="<my domain>/api/queues"):
url = f"https://{user}:{password}@{domain}"
res = requests.get(url)
message_count = 0
for queue in res.json():
message_count += queue["messages"]
return message_count
def lambda_handler(event, context):
metric_data = [{'MetricName': 'RabbitMQQueueLength', "Unit": "None", 'Value': get_queue_count()}]
print(metric_data)
response = cloudwatch_client.put_metric_data(MetricData=metric_data, Namespace="RabbitMQ")
print(response)
在测试运行时返回以下输出:
Response:
{
"errorMessage": "2020-06-30T19:50:50.175Z d3945a14-82e5-42e5-b03d-3fc07d5c5148 Task timed out after 15.02 seconds"
}
Request ID:
"d3945a14-82e5-42e5-b03d-3fc07d5c5148"
Function logs:
START RequestId: d3945a14-82e5-42e5-b03d-3fc07d5c5148 Version: $LATEST
/var/runtime/botocore/vendored/requests/api.py:72: DeprecationWarning: You are using the get() function from 'botocore.vendored.requests'. This dependency was removed from Botocore and will be removed from Lambda after 2021/01/30. https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/. Install the requests package, 'import requests' directly, and use the requests.get() function instead.
DeprecationWarning
[{'MetricName': 'RabbitMQQueueLength', 'Value': 295}]
END RequestId: d3945a14-82e5-42e5-b03d-3fc07d5c5148
您可以看到我能够很好地与 RabbitMQ API 交互 - 尝试发布指标时该函数挂起。
lambda 函数使用 IAM 角色 put-custom-metric,该角色使用策略 recommended here 以及 CloudWatchFullAccess 进行良好衡量。
我的 RabbitMQ 服务器所在的内部负载均衡器上的资源受 VPN 保护,因此我有必要将此功能与适当的 VPC/安全组相关联。这是它现在的设置方式(我知道这是有效的,否则与 RabbitMQ 的通信将失败): 我阅读了this post,其中多个贡献者建议增加函数内存和超时设置。这两个我都做了,超时依然存在。
我可以在 5 秒内在 CloudWatch 上毫无问题地在本地运行该指标。
【问题讨论】:
-
是否有理由使用 Lambda 将 RMQ 指标导出到 CloudWatch?您可以简单地使用 plugin 或简单地在 RMQ 节点上运行 cron 作业。
-
@noxdafox 啊,这很酷。因此,不是在 AWS 端进行黑客攻击,而是说我可以将 AWS 凭证放在我的 RMQ 服务器上并直接写入 cloudwatch?这绝对看起来是更清洁的解决方案。我在专用 VPC 端点方面取得了一些进展,但我可能会改变方向。我的应用程序是 dockerized,我使用
rabbitmq:3-management-alpine进行 RMQ。有关在 docker 中实施您的方法的任何提示?我的第一个想法是编写一个使用 alpine 映像的自定义 Dockerfile,然后执行其余的配置。
标签: python-3.x amazon-web-services aws-lambda rabbitmq