Creación de un conector personalizado a un origen de datos
En este tema se describe cómo conectar un origen de datos personalizado a CloudWatch. Puede conectar un origen de datos personalizado a CloudWatch de dos maneras:
-
Con una plantilla de ejemplo que proporciona CloudWatch. Puede usar JavaScript o Python con esta plantilla. Estas plantillas incluyen un ejemplo de código de Lambda que le resultará útil cuando cree la función de Lambda. A continuación, puede modificar la función de Lambda de la plantilla para conectarla al origen de datos personalizado.
-
Mediante la creación de una función de AWS Lambda desde cero que implemente el conector del origen de datos, la consulta de datos y la preparación de las series temporales para que CloudWatch las utilice. Esta función debe añadir previamente o combinar puntos de datos si es necesario y también alinear el período y las marcas de tiempo para que sea compatible con CloudWatch.
Contenido
Uso de una plantilla
El uso de una plantilla crea una función de Lambda de muestra y puede ayudar a crear el conector personalizado más rápido. Estas funciones de ejemplo proporcionan códigos de ejemplo para muchos escenarios comunes relacionados con la creación de un conector personalizado. Puede examinar el código de Lambda después de crear un conector con una plantilla y, a continuación, modificarlo para utilizarlo en la conexión al origen de datos.
Además, si usa la plantilla, CloudWatch se encarga de crear la política de permisos de Lambda y de adjuntar etiquetas de recursos a la función de Lambda.
Cómo usar la plantilla para crear un conector a un origen de datos personalizado
Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/
. -
En el panel de navegación, seleccione Configuración.
Seleccione la pestaña Orígenes de datos de métricas.
Elija Crear origen de datos.
Seleccione el botón de radio de Personalización: plantilla de inicio y, a continuación, seleccione Siguiente.
Escriba un nombre para el origen de datos.
Seleccione una de las plantillas de la lista.
Seleccione Node.js o Python.
Elija Crear origen de datos.
El nuevo origen personalizado que acaba de añadir no aparecerá hasta que la pila AWS CloudFormation haya terminado de crearlo. Para comprobar el progreso, puede elegir Ver el estado de mi pila de CloudFormation. O puede seleccionar el icono de actualización para actualizar esta lista.
Cuando el nuevo origen de datos aparezca en esta lista, estará listo para que lo pruebe en la consola y lo modifique.
(Opcional) Para consultar los datos de prueba de este origen en la consola, siga las instrucciones en Creación de un gráfico de métricas a partir de otro origen de datos.
Modifique la función de Lambda según sus necesidades.
En el panel de navegación, seleccione Configuración.
Seleccione la pestaña Orígenes de datos de métricas.
Seleccione Ver en la consola de Lambda para el origen que desea modificar.
Ahora puede modificar la función para obtener acceso al origen de datos. Para obtener más información, consulte Paso 1: crear la función.
nota
Al utilizar la plantilla, al escribir la función de Lambda no es necesario seguir las instrucciones en Paso 2: crear una política de permisos de Lambda o Paso 3: asociar la etiqueta de recurso a la función de Lambda. CloudWatch realizó estos pasos porque utilizó la plantilla.
Creación de un origen de datos personalizado desde cero
Siga los pasos de esta sección para crear una función de Lambda que conecte CloudWatch con un origen de datos.
Paso 1: crear la función
Un conector de origen de datos personalizado debe admitir eventos GetMetricData
de CloudWatch. Si lo desea, también puede implementar un evento DescribeGetMetricData
para proporcionar documentación a los usuarios en la consola de CloudWatch sobre cómo usar el conector. La respuesta DescribeGetMetricData
también se puede usar para establecer los valores predeterminados que se utilizan en el generador de consultas personalizadas de CloudWatch.
CloudWatch proporciona fragmentos de código como ejemplos para ayudarlo a comenzar. Para obtener más información, consulte el repositorio de muestras en https://github.com/aws-samples/cloudwatch-data-source-samples
Restricciones
La respuesta de Lambda debe ser inferior a 6 Mb. Si la respuesta supera los 6 Mb, la respuesta
GetMetricData
marca la función de Lambda comoInternalError
y no devuelve ningún dato.La función de Lambda debe completar la ejecución en 10 segundos para fines de visualización y creación de cuadros de mando, o en 4,5 segundos para el uso de alarmas. Si el tiempo de ejecución supera ese tiempo, la respuesta
GetMetricData
marca la función de Lambda comoInternalError
y no se devuelve ningún dato.La función de Lambda debe enviar su salida mediante marcas de tiempo de época en segundos.
Si la función de Lambda no vuelve a muestrear los datos y, en cambio, devuelve datos que no corresponden a la hora de inicio ni a la duración del período que solicitó el usuario de CloudWatch, CloudWatch ignora esos datos. Los datos adicionales se descartan de cualquier visualización o alarma. También se descartan todos los datos que no estén entre la hora de inicio y la hora de finalización.
Por ejemplo, si un usuario solicita datos entre las 10:00 y las 11:00 con un período de 5 minutos, los intervalos de tiempo válidos para devolver los datos son de “10:00:00 a 10:04:59” y “10:05:00 a 10:09:59”. Debe devolver una serie temporal que incluya
10:00 value1
,10:05 value2
, etc. Si la función devuelve10:03 valueX
, por ejemplo, se descarta porque las 10:03 no corresponden a la hora ni al período de inicio solicitados.Los conectores de orígenes de datos de CloudWatch no admiten consultas multilínea. Cada fuente de línea se reemplaza por un espacio cuando se ejecuta la consulta o cuando se crea una alarma o un widget de panel con la consulta. En algunos casos, esto puede hacer que la consulta no sea válida.
Evento GetMetricData
Carga de solicitud
El siguiente es un ejemplo de una carga de solicitud GetMetricData
enviada como entrada a la función de Lambda.
{ "EventType": "GetMetricData", "GetMetricDataRequest": { "StartTime": 1697060700, "EndTime": 1697061600, "Period": 300, "Arguments": ["serviceregistry_external_http_requests{host_cluster!=\"prod\"}"] } }
StartTime: la marca de tiempo que especifica los primeros datos que se devolverán. El tipo es marca de tiempo, época y segundos.
EndTime: la marca de tiempo que especifica los últimos datos que se van a devolver. El tipo es marca de tiempo, época y segundos.
Período: el número de segundos que representa cada agregación de los datos de las métricas. El mínimo es de 60 segundos. El tipo es segundos.
Argumentos: una matriz de argumentos para pasar a la expresión matemática métrica de Lambda. Para obtener más información sobre cómo pasar argumentos, consulte Cómo pasar argumentos a la función de Lambda.
Carga de respuesta
A continuación, se muestra un ejemplo de una carga de respuesta GetMetricData
que devuelve la función de Lambda.
{ "MetricDataResults": [ { "StatusCode": "Complete", "Label": "CPUUtilization", "Timestamps": [ 1697060700, 1697061000, 1697061300 ], "Values": [ 15000, 14000, 16000 ] } ] }
La carga de respuesta contendrá un campo MetricDataResults
o un campo Error
, pero no ambos.
Un campo MetricDataResults
es una lista de campos de series temporales de tipo MetricDataResult
. Cada uno de esos campos de series temporales puede incluir los siguientes campos.
StatusCode: (opcional)
Complete
indica que se devolvieron todos los puntos de datos del intervalo de tiempo solicitado.PartialData
significa que se devolvió un conjunto de puntos de datos incompleto. Si esto se omite, el valor predeterminado esComplete
.Valores válidos:
Complete
|InternalError
|PartialData
|Forbidden
Mensajes: lista opcional de mensajes con información adicional sobre los datos devueltos.
Tipo: matriz de objetos MessageData con cadenas
Code
yValue
.Etiqueta: la etiqueta legible por humanos asociada a los datos.
Tipo: cadena
Marcas temporales: las marcas de tiempo de los puntos de datos, formateadas por épocas. El número de marcas de tiempo siempre coincide con el número de valores y el valor de
Timestamps[x]
esValues[x
].Tipo: matriz de marcas temporales
Valores: los valores de los puntos de datos de la métrica, correspondientes a
Timestamps
. El número de valores siempre coincide con el número de marcas temporales y el valor deTimestamps[x]
esValues[x
].Tipo: matriz de dobles
Para obtener más información acerca de objetos Error
, consulte las siguientes secciones.
Formatos de respuesta a errores
Si lo desea, puede utilizar la respuesta de error para proporcionar más información sobre los errores. Le recomendamos que devuelva un error de validación del código cuando se produzca un error de validación, por ejemplo, cuando falte un parámetro o sea del tipo incorrecto.
El siguiente es un ejemplo de la respuesta cuando la función de Lambda quiere generar una excepción de validación GetMetricData
.
{ "Error": { "Code": "Validation", "Value": "Invalid Prometheus cluster" } }
El siguiente ejemplo muestra la respuesta cuando la función de Lambda indica que no puede devolver datos debido a un problema de acceso. La respuesta se traduce en una serie temporal única con un código de estado de Forbidden
.
{ "Error": { "Code": "Forbidden", "Value": "Unable to access ..." } }
A continuación se muestra un ejemplo de cuando la función de Lambda genera una excepción InternalError
general, que se traduce en una única serie temporal con un código de estado InternalError
y un mensaje. Siempre que un código de error tenga un valor distinto de Validation
o Forbidden
, CloudWatch asume que se trata de un error interno genérico.
{ "Error": { "Code": "PrometheusClusterUnreachable", "Value": "Unable to communicate with the cluster" } }
Evento DescribeGetMetricData
Carga de solicitud
El siguiente es un ejemplo de una carga de solicitud de DescribeGetMetricData
.
{ "EventType": "DescribeGetMetricData" }
Carga de respuesta
El siguiente es un ejemplo de una carga de respuesta de DescribeGetMetricData
.
{ "Description": "Data source connector", "ArgumentDefaults": [{ Value: "default value" }] }
Descripción: descripción de cómo utilizar el conector del origen de datos. Esta descripción aparecerá en la consola de CloudWatch. Se admite Markdown.
Tipo: cadena
ArgumentDefaults: matriz opcional de valores predeterminados de argumentos que se utiliza para rellenar previamente el generador de orígenes de datos personalizados.
Si se devuelve
[{ Value: "default value 1"}, { Value: 10}]
, el generador de consultas de la consola de CloudWatch muestra dos entradas: la primera con el “valor predeterminado 1” y la segunda con 10.Si no se proporciona
ArgumentDefaults
, se muestra una única entrada con el tipo predeterminado establecido enString
.Tipo: matriz de objetos que contiene el valor y el tipo.
Error: (opcional) se puede incluir un campo de error en cualquier respuesta. Puede ver algunos ejemplos en Evento GetMetricData.
Consideraciones importantes sobre las alarmas de CloudWatch
Si va a utilizar el origen de datos para configurar las alarmas de CloudWatch, debe configurarlo para que notifique los datos con marcas temporales a cada minuto a CloudWatch. Para obtener más información y otras consideraciones sobre la creación de alarmas en las métricas de los orígenes de datos conectados, consulte Creación de una alarma basada en un origen de datos conectado.
(Opcional) Uso de AWS Secrets Manager para almacenar credenciales
Si la función de Lambda necesita usar credenciales para acceder al origen de datos, le recomendamos que utilice AWS Secrets Manager para almacenar estas credenciales en lugar de codificarlas en la función de Lambda. Para obtener más información sobre el uso de AWS Secrets Manager con Lambda, consulte Utilizar secretos de AWS Secrets Manager en funciones de AWS Lambda.
(Opcional) Conexión a un origen de datos en una VPC
Si el origen de datos se encuentra en una VPC administrada por Amazon Virtual Private Cloud, debe configurar la función de Lambda para tener acceso. Para obtener más información, consulte Conexión de redes salientes a los recursos de una VPC.
Es posible que también necesite configurar los puntos de conexión del servicio de VPC para acceder a servicios como AWS Secrets Manager. Para obtener más información, consulte Acceso a un servicio de AWS a través de un punto de conexión de VPC de interfaz.
Paso 2: crear una política de permisos de Lambda
Debe crear una declaración de política que conceda permiso a CloudWatch para usar la función de Lambda que ha creado. Puede utilizar la AWS CLI o la consola de Lambda para crear la declaración de política.
Cómo usar la AWS CLI para crear la declaración de política
Escriba el siguiente comando. Sustituya
123456789012
por el ID de la cuenta, sustituyamy-data-source-function
por el nombre de la función de Lambda y sustituyaMyDataSource-DataSourcePermission1234
por un valor único arbitrario.aws lambda add-permission --function-name
my-data-source-function
--statement-idMyDataSource-DataSourcePermission1234
--action lambda:InvokeFunction --principal lambda.datasource.cloudwatch.amazonaws.com --source-account123456789012
Paso 3: asociar la etiqueta de recurso a la función de Lambda
La consola CloudWatch determina qué funciones de Lambda son conectores de orígenes de datos mediante una etiqueta. Al crear un origen de datos mediante uno de los asistentes, la pila AWS CloudFormation que la configura aplica automáticamente la etiqueta. Al crear un origen de datos usted mismo, puede usar la siguiente etiqueta para la función de Lambda. Esto hace que el conector aparezca en el menú desplegable Orígenes de datos de la consola de CloudWatch al consultar las métricas.
Una etiqueta con
cloudwatch:datasource
como la clave ycustom
como el valor.