0
点赞
收藏
分享

微信扫一扫

增强AWS ECS监控:批量生产监控设置

介绍: Amazon Elastic Container Service(ECS)简化了容器化应用的部署和管理。然而,确保ECS集群的可靠性和性能需要强大的监控和告警。在本文中,我们将探讨批量生产监控的必要性,并详细介绍关键监控功能的实现,包括启用Container Insights和设置成功率、CPU利用率和内存利用率的告警。

批量生产监控的必要性

在生产环境中监控ECS集群是至关重要的,原因有以下几点:

  1. 主动问题识别: 生产环境是动态的,可能会出现意外问题。监控使您能够在问题影响应用性能之前识别并解决潜在问题。
  2. 资源优化: 监控提供有关资源利用情况的见解,使您能够优化资源分配,根据需要进行扩展,并避免瓶颈。
  3. 确保可用性: 批量生产监控有助于通过及时检测和响应异常或故障来确保服务的可用性。
  4. 性能调优: 了解ECS服务的性能情况使您能够为实现最佳效率微调配置,提供更好的用户体验。

现在,让我们深入了解关键监控功能的实现。

启用Container Insights

Container Insights是一个强大的功能,提供对ECS容器性能和健康状况的详细可见性。使用AWS CLI或Python SDK启用Container Insights是一个简单的过程:

aws ecs update-cluster-settings --cluster <CLUSTER_NAME> --settings name=containerInsights,value=enabled --region <REGION_NAME>

或使用Python:

import boto3

def enable_container_insights(cluster_name, region_name):
    client = boto3.client('ecs', region_name=region_name)
    response = client.update_cluster_settings(
        cluster=cluster_name,
        settings=[
            {
                'name': 'containerInsights',
                'value': 'enabled'
            },
        ]
    )
    return response

# 启用Container Insights
enable_container_insights('<CLUSTER_NAME>', '<REGION_NAME>')

批量生产监控:成功率

监控ECS服务的成功率对确保容器正常运行至关重要。以下脚本基于ECS成功率设置CloudWatch告警:

import boto3
import json
import os

def get_service_names(cluster_name, region_name=None):
    # Create ECS client
    ecs_client = boto3.client('ecs', region_name=region_name)

    # Paginate to get service names
    next_token = None
    service_names = []

    while True:
        # Get one page of service information
        if next_token:
            response = ecs_client.list_services(cluster=cluster_name, nextToken=next_token)
        else:
            response = ecs_client.list_services(cluster=cluster_name)
        services = response['serviceArns']

        # Filter service names
        for service in services:
            service_name = service.split('/')[-1]
            if service_name.startswith(('prod', 'pro')):
                service_names.append(service_name)

        # Check if there is a next page
        if 'nextToken' in response:
            next_token = response['nextToken']
        else:
            break

    return service_names

def create_ecs_success_rate(ClusterName,ServiceName):
    dic={
            "AlarmName": f"{ServiceName}_SuccessRate_P1",
            "ActionsEnabled": True,
            "OKActions": [
                "arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic"
            ],
            "AlarmActions": [
                "arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic"
            ],
            "InsufficientDataActions": [],
            "EvaluationPeriods": 2,
            "DatapointsToAlarm": 2,
            "Threshold": 100.0,
            "ComparisonOperator": "LessThanThreshold",
            "TreatMissingData": "missing",
            "Metrics": [
                {
                    "Id": "e1",
                    "Expression": "100*(m1/m2)",
                    "Label": "SuccessRate",
                    "ReturnData": True
                },
                {
                    "Id": "m1",
                    "MetricStat": {
                        "Metric": {
                            "Namespace": "ECS/ContainerInsights",
                            "MetricName": "RunningTaskCount",
                            "Dimensions": [
                                {
                                    "Name": "ServiceName",
                                    "Value": ServiceName
                                },
                                {
                                    "Name": "ClusterName",
                                    "Value": ClusterName
                                }
                            ]
                        },
                        "Period": 60,
                        "Stat": "Maximum"
                    },
                    "ReturnData": False
                },
                {
                    "Id": "m2",
                    "MetricStat": {
                        "Metric": {
                            "Namespace": "ECS/ContainerInsights",
                            "MetricName": "DesiredTaskCount",
                            "Dimensions": [
                                {
                                    "Name": "ServiceName",
                                    "Value": ServiceName
                                },
                                {
                                    "Name": "ClusterName",
                                    "Value": ClusterName
                                }
                            ]
                        },
                        "Period": 60,
                        "Stat": "Maximum"
                    },
                    "ReturnData": False
                }
            ]
        }

    with open("alarm_ecs_SuccessRate.json","w+",encoding="utf-8") as f:
        json.dump(dic,f,ensure_ascii=False)

    cmd="aws cloudwatch put-metric-alarm --cli-input-json file://alarm_ecs_SuccessRate.json"
    os.system(cmd)

def main():
    cluster_name = '<CLUSTER_NAME>'
    service_names = get_service_names(cluster_name)
    for service_name in service_names:
        create_ecs_success_rate(cluster_name,service_name)
 
main()

批量生产监控:CPU利用率

有效监控CPU利用率有助于识别性能瓶颈。以下脚本为ECS CPU利用率配置CloudWatch告警:

import boto3

def get_service_names(cluster_name, region_name=None):
    # Create ECS client
    ecs_client = boto3.client('ecs', region_name=region_name)

    # Paginate to get service names
    next_token = None
    service_names = []

    while True:
        # Get one page of service information
        if next_token:
            response = ecs_client.list_services(cluster=cluster_name, nextToken=next_token)
        else:
            response = ecs_client.list_services(cluster=cluster_name)
        services = response['serviceArns']

        # Filter service names
        for service in services:
            service_name = service.split('/')[-1]
            if service_name.startswith(('prod', 'pro')):
                service_names.append(service_name)

        # Check if there is a next page
        if 'nextToken' in response:
            next_token = response['nextToken']
        else:
            break

    return service_names

def create_cpu_utilization_alarm(cluster_name,service_name):
    client = boto3.client('cloudwatch')
    client.put_metric_alarm(
        Namespace='AWS/ECS',
        MetricName='CPUUtilization',
        Dimensions=[
            {
                'Name': 'ServiceName',
                'Value': service_name
            },
            {
                'Name': 'ClusterName',
                'Value': cluster_name
            },
        ],
        Period=60,
        Statistic='Maximum',
        AlarmName=f'{service_name}_CPUUtilization_P0',
        AlarmDescription='ecs CPUUtilization',
        ActionsEnabled=True,
        ComparisonOperator='GreaterThanThreshold',
        Threshold=80,
        DatapointsToAlarm=2,
        EvaluationPeriods=2,
        TreatMissingData='notBreaching',
        AlarmActions=[
            'arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic'
        ],
        OKActions=[
            'arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic'
        ]
    )

def main():
    cluster_name = '<CLUSTER_NAME>'
    service_names = get_service_names(cluster_name)
    for service_name in service_names:
        create_cpu_utilization_alarm(cluster_name,service_name)
main()

批量生产监控:内存利用率

优化内存利用率对于保持最佳性能至关重要。以下脚本为ECS内存利用率创建CloudWatch告警:

import boto3

def get_service_names(cluster_name, region_name=None):
    # Create ECS client
    ecs_client = boto3.client('ecs', region_name=region_name)

    # Paginate to get service names
    next_token = None
    service_names = []

    while True:
        # Get one page of service information
        if next_token:
            response = ecs_client.list_services(cluster=cluster_name, nextToken=next_token)
        else:
            response = ecs_client.list_services(cluster=cluster_name)
        services = response['serviceArns']

        # Filter service names
        for service in services:
            service_name = service.split('/')[-1]
            if service_name.startswith(('prod', 'pro')):
                service_names.append(service_name)

        # Check if there is a next page
        if 'nextToken' in response:
            next_token = response['nextToken']
        else:
            break

    return service_names

def create_memory_utilization_alarm(cluster_name,service_name):
    client = boto3.client('cloudwatch')
    client.put_metric_alarm(
        Namespace='AWS/ECS',
        MetricName='MemoryUtilization',
        Dimensions=[
            {
                'Name': 'ServiceName',
                'Value': service_name
            },
            {
                'Name': 'ClusterName',
                'Value': cluster_name
            },
        ],
        Period=60,
        Statistic='Maximum',
        AlarmName=f'{service_name}_MemoryUtilization_P0',
        AlarmDescription='ecs MemoryUtilization',
        ActionsEnabled=False,
        ComparisonOperator='GreaterThanThreshold',
        Threshold=80,
        DatapointsToAlarm=2,
        EvaluationPeriods=2,
        TreatMissingData='notBreaching',
        AlarmActions=[
            'arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic'
        ],
        OKActions=[
            'arn:aws:sns:us-east-1:830700710775:Govee_server_Alarms_Topic'
        ]
    )

def main():
    cluster_name = '<CLUSTER_NAME>'
    service_names = get_service_names(cluster_name)
    for service_name in service_names:
        create_memory_utilization_alarm(cluster_name,service_name)
main()

结论

批量生产监控是确保ECS集群可靠性、性能和可用性的基本实践。通过启用Container Insights并为成功率、CPU利用率和内存利用率设置CloudWatch告警,您可以主动解决问题,优化资源使用,并向用户提供无缝体验。实施这些监控功能是实现ECS环境运营卓越的关键步骤。

举报

相关推荐

0 条评论