Flujos de eventos
¡¡¡!!! Info "Aviso"
Las funciones de observabilidad de Equinix Metal se encuentran actualmente en fase Beta y no están disponibles para todos los clientes. Su finalidad es únicamente de evaluación y prueba. Esta función actualmente no se factura y no está cubierta por un SLA.
Puede supervisar eventos específicos y datos de actividad de sus organizaciones Metal casi en tiempo real mediante flujos de eventos. Los flujos de eventos pueden proporcionar datos de eventos críticos para ayudarle a comprender y analizar sus necesidades empresariales. Estos eventos incluyen:
- Eventos de cuentas y organizaciones
- Servicios y eventos de facturación
- Eventos de gestión de dispositivos
- Gestión de redes Eventos
Los flujos de eventos sólo son visibles para los propietarios y administradores de una organización.
Limitaciones
Actualmente, los flujos de eventos sólo admiten Splunk como destino. Los datos de Observability Stream se envían a Splunk a través de la interfaz [Splunk HTTP Event Collector ("HEC"). Para recibir datos de Observability Stream, primero debe configurar un Colector de Eventos HTTP en su instancia Splunk. Recomendamos crear un colector dedicado específicamente para recibir datos de Observability Stream.
El envío de datos de Observability Stream a Splunk está sujeto a las siguientes limitaciones:
- Para garantizar el cifrado de datos en tránsito, sólo se permiten conexiones HTTPS. No se admite el envío de datos a un Splunk HEC utilizando HTTP sin cifrar.
- Todos los datos de Observability Stream se envían a Splunk como eventos JSON; NO se admiten datos sin procesar.
- Los eventos JSON se enviarán al punto final estándar
/services/collector/event; NO se admiten URL de puntos finales alternativos. - Los eventos JSON serán enviados al índice por defecto que fue configurado al crear el Colector de Eventos Splunk HTTP. Sobrescribir el índice de los eventos enviados a Splunk NO es compatible.
- NO se admite la confirmación del indexador.
La API de observabilidad
Si está utilizando la API de Observability, debe tener en cuenta algunas diferencias entre ésta y la actual API de Equinix Metal.
- nuevos puntos finales de API
- nuevo mecanismo de autenticación
En primer lugar, Observability tiene sus propios puntos finales de API a los que se puede acceder en https://observability.equinixmetal.net.
En segundo lugar, la API de observabilidad tiene un mecanismo de autenticación en el que intercambia su clave de API de Equinix Metal por un token web JSON (JWT) de corta duración que utiliza para la autenticación de todas las solicitudes de observabilidad. El token caduca a los 5 minutos. Para recuperar un JWT, envíe una solicitud POST al punto final iam.metalctrl.io/api-keys/exchange.
curl -X POST \
-H "Authorization: bearer <API_TOKEN>" \
https://iam.metalctrl.io/api-keys/exchange
La respuesta será un JSON "access_token" que utilizará para autenticar sus solicitudes a la API de Observability.
{
"access_token": "eyJ....98"
}
La API de observabilidad no acepta claves de la API de Equinix Metal para la autenticación.
Creación de un flujo de eventos
- Console
- API
Cree un flujo de eventos para exportar los datos del servidor a Splunk para su almacenamiento y análisis. Para crear un flujo, haga lo siguiente:
-
Vaya a [Equinix Metal Portal e introduzca sus credenciales para iniciar sesión en el portal.
-
En el menú desplegable Organización, seleccione la organización para crear un flujo de eventos.
-
Haga clic en la pestaña Observabilidad.

-
Haga clic en, Crear flujo de eventos.
-
En el modal Crear flujo de eventos, introduzca un nombre fácil de usar en el campo Nombre.
-
Opcional. Introduzca una descripción para el flujo de eventos en el campo de descripción.
-
Introduzca su nombre de host Splunk y la clave API en los campos proporcionados para enviar datos a Splunk.
El nombre de host de la conexión debe tomarse de la [HTTP Event Collector URI. El nombre de host debe especificarse como una cadena con un sufijo opcional de número de puerto; los valores válidos incluyen
http-inputs-my-org.splunkcloud.comosplunk.example.com:8443.La Clave API debe ser el token HTTP Event Collector que se generó al crear el endpoint Splunk HEC. Esto se almacenará en un formato cifrado que sólo puede ser descifrado por el trabajador que envía los datos de Observability Stream.
Puede crear un nuevo flujo enviando una solicitud POST al punto final /v1/organizations/{org-id}/streams.
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams" \
-d '{
"stream_name": "<string>",
"description": "<string>",
"connection": {,
"type": "splunk",
"api_key": "<string>",
"hostname": "<string>"
}
Parámetros corporales:
"org-id"(required) - The Metal organization ID that owns the stream."stream_name"(required) - Enter a name for this stream."description"(optional) - Include a description for a stream."connection"(required) - The connection parameters that define how data in an observability stream will be delivered to the customer.
Comprobación de la conexión de flujo
- Console
- API
Antes de transmitir una conexión de datos a Splunk, debe probarla para garantizar su validez. Para probar la conexión de flujo, haga lo siguiente:
-
En el modal Crear flujo de eventos, introduzca su nombre de host Splunk y su clave API en los campos proporcionados, si aún no lo ha hecho.
-
Haga clic, Pruebe la conexión de flujo.
La conexión es válida si aparece en pantalla el mensaje Prueba superada. Aparecerá un mensaje de error si NO se supera la prueba de conexión. Debe recibir un mensaje Prueba superada para asegurarse de que la conexión de prueba es válida para transmitir datos a Splunk.

-
Haga clic en Guardar para guardar el flujo de eventos. El flujo de eventos se guarda en la tabla Flujos de eventos de la página Observabilidad.
Puede probar una nueva conexión de flujo enviando una solicitud POST al punto final v1/organizations/{org-id}/connection/validate.
curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/connection/validate \
-d '{
"type": "splunk",
"api_key": "<string>",
"hostname": "<string>"
}
Parámetros corporales:
"type"(required) - The type of system to connect to. This determines the available parameters."api_key"(required) - The API key that will be used to authenticate the connection to the Splunk HTTP Event Collector. The API key will be stored encrypted."hostname"(required) - The hostname of the Splunk server to connect to with an optional port number suffix.
Gestión de un flujo de eventos
- Console
- API
Una vez creado el flujo de eventos en la consola de Metal, podrá gestionarlo desde la pestaña Observabilidad de su organización.

Para obtener una lista de todos los flujos de observabilidad configurados para la organización proporcionada, envíe una solicitud GET al punto final /v1/organizations/{org-id}/streams.
curl -X GET \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams"
Para recuperar los detalles de configuración del flujo proporcionado en función de su propietario e ID, envíe una solicitud GET al punto final /v1/organizations/{org-id}/streams/{stream-id}.
curl -X GET \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams/{stream-id}"
Para actualizar la configuración de un flujo de observabilidad existente, envíe una solicitud PUT al punto final /v1/organizations/{org-id}/streams/{stream-id}.
Nota: No puede actualizar los valores de los campos sensibles, como las claves API de conexión, utilizando este método; debe eliminar el flujo y volver a crearlo utilizando el nuevo valor.
curl -X PUT \
-H "Content-Type: application/json" \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams/{stream-id} \
-d '{
"stream_name": "<string>",
"description": "<string>",
"connection": {
"type": "splunk",
"hostname": "<string>"
}
}'
Borrar un flujo de eventos
- Console
- API
Para detener el flujo de datos a su instancia Splunk, puede eliminar el flujo de eventos. Para eliminar un flujo de eventos, haga lo siguiente:
-
En la tabla Flujos de eventos, haga clic en el icono de la papelera de la columna Borrar. Aparecerá la ventana Eliminar flujo de eventos.
-
Introduzca Borre en el campo y pulse, Borre.
En la API, puede eliminar un flujo enviando una solicitud DELETE al punto final /v1/organizations/{org-id}/streams/{stream-id}.
curl -X DELETE -H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams/{stream-id}"
Una vez eliminado un flujo, dejará inmediatamente de aceptar nuevos datos de las fuentes, pero seguirá entregando datos en vuelo. Una vez entregados todos los datos en vuelo, el flujo se elimina y se liberan todos los recursos.
Metadatos de eventos Splunk
El Servicio de Observabilidad establece las siguientes claves [Splunk Event metadata para cada evento de registro de auditoría que envía a su flujo:
time- The timestamp at which the event occurred, specified in seconds since the Unix epoch.source- All events will specify a source ofequinix.sourcetype- Audit log events will specify a source type oflog.fields- Additional fields for indexing as described below.
Campos de índice
Además de las claves de metadatos estándar de Splunk descritas anteriormente, el Servicio de Observabilidad establece los siguientes campos de índice personalizados para cada evento de registro que envía a su flujo. Estos campos son opcionales y se omitirán si están ausentes.
level- A human-readable indication of the logging level, such asINFOorDEBUG.severity- A numeric severity level; higher numbers indicate more severe events (such as errors or violations).
Datos de eventos de Splunk
El contenido de la clave event enviada al recolector de eventos HTTP de Splunk como "Datos del evento" es un documento JSON estructurado con información específica de la aplicación sobre los eventos que se están registrando.
Para obtener una referencia completa, consulte la Documentación del esquema de eventos de Splunk.
- Splunk Event - Example JSON
- Splunk Event - JSON Schema
{
"stream" : {
"streamId" : "dce13c1d-0589-406b-af40-854156a0621e",
"streamName" : "Example Stream"
},
"source" : {
"category" : "audit",
"type" : "api_request",
"service" : "metal",
"organizationId" : "99be473c-ee3c-4aeb-a678-eba3fdae7ca6",
"projectId" : "99be473c-ee3c-4aeb-a678-eba3fdaebeef"
},
"schema" : "v1",
"timestamp" : "2024-04-16T14:58:21.442334Z",
"level" : "INFO",
"eventId" : "6910f03f-ec60-42fc-9e9d-c5f6af2f732d",
"event" : {
"eventName" : "instance_provision_requested",
"status" : "failed",
"auth" : {
"authType" : "user",
"user" : {
"userId" : "582865f9-904b-4061-b536-2420eb01ecdc",
"userName" : "jdoe@equinix.com"
},
"role" : {
"roleName" : "collaborator"
}
},
"httpRequest" : {
"host" : "api.equinix.com",
"method" : "PUT",
"path" : "/metal/v1/projects/99f8e7f1-fe4a-441a-ade9-687743f080f6",
"scheme" : "http",
"statusCode" : 200,
"userAgent" : "metal-cli/metal equinix-sdk-go/0.30.0",
"sourceIpAddress" : "111.111.111.11"
}
}
}
{
"description" : "The customer-facing log format for the Equinix Observability Service.",
"type" : "object",
"properties" : {
"stream" : {
"description" : "Provides metadata about the observability stream that produced this log entry; can be used to differentiate data sources in situations where multiple streams are writing to the same destination.",
"type" : "object",
"properties" : {
"streamId" : {
"description" : "Unique identifier of the observability stream that produced this log entry.",
"type" : "string",
"format" : "uuid"
},
"streamName" : {
"description" : "Name of the observability stream that produced this log entry.",
"type" : "string",
"examples" : [ "Example Stream" ]
}
},
"required" : [ "streamId", "streamName" ],
"title" : "Stream",
"examples" : [ {
"streamId" : "e55f79d4-0d8a-4460-a566-ff93af4f90e4",
"streamName" : "Example Stream"
} ]
},
"source" : {
"description" : "Provides metadata about the source from which this log entry originated.",
"type" : "object",
"properties" : {
"category" : {
"description" : "Groups logs into high-level application categories.",
"type" : "string",
"enum" : [ "audit", "validation" ]
},
"type" : {
"description" : "Differentiates types of log events withing a particular category.",
"type" : "string",
"enum" : [ "api_request", "validation_request" ]
},
"service" : {
"description" : "Indicates the service that produced this log entry.",
"type" : "string",
"enum" : [ "metal" ]
},
"organizationId" : {
"description" : "Indicates the customer Organization ID with which this log entry is associated.",
"type" : "string",
"format" : "uuid"
},
"projectId" : {
"description" : "Indicates the customer Project ID with which this log entry is associated.",
"type" : "string",
"format" : "uuid"
}
},
"required" : [ "category", "type", "service", "organizationId" ],
"title" : "Source",
"examples" : [ {
"category" : "audit",
"type" : "api_request",
"service" : "metal",
"organizationId" : "0e714017-6d9c-4dc5-828d-b8a156502496"
} ]
},
"schema" : {
"description" : "Indicates the schema version of this log entry.",
"type" : "string",
"enum" : [ "v1" ]
},
"timestamp" : {
"description" : "The timestamp at which this log entry was produced, in ISO8601 format.",
"type" : "string",
"format" : "date-time",
"examples" : [ "2024-04-16T14:58:21.442334Z" ]
},
"level" : {
"description" : "A human-readable indication of the severity level of this log entry.",
"type" : "string",
"examples" : [ "INFO" ]
},
"eventId" : {
"description" : "Unique identifier for this log event.",
"type" : "string",
"format" : "uuid"
},
"event" : {
"description" : "The application-specific log event payload. In the future the specific format will vary based on the\n source category and type, but for now we use a single log event schema.",
"type" : "object",
"properties" : {
"eventName" : {
"description" : "An application-provided name for the event. Event names should be fixed by the application\n (i.e. should not vary based on request parameters) to enable filtering/querying by the customer, and should carry\n meaning to the customer. In the case of API request logs, this would correspond to an operation name.",
"type" : "string",
"examples" : [ "project_updated", "instance_provision_requested" ]
},
"status" : {
"description" : "An indication of the status associated with the event, e.g. request success/failure.",
"type" : "string",
"examples" : [ "success", "failed", "unauthorized" ]
},
"auth" : {
"description" : "Provides authentication and authorization information about the principal associated with the\n log event. In most cases, this will be the one who made the request.",
"type" : "object",
"properties" : {
"authType" : {
"description" : "Indicates the type of entity for the principal associated with the request.",
"type" : "string",
"enum" : [ "user" ]
},
"user" : {
"description" : "Provides identifying information about the user associated with the log event.",
"type" : "object",
"properties" : {
"userId" : {
"description" : "Unique user identifier; this is an opaque system-assigned ID that is not expected to be recognizable to people.",
"type" : "string",
"examples" : [ "1bec4119-a889-4809-89e9-c4572dc002ec" ]
},
"userName" : {
"description" : "Provides a more human-friendly display name for the user.",
"type" : "string",
"examples" : [ "jdoe@equinix.com" ]
}
},
"required" : [ "userId", "userName" ],
"title" : "User",
"examples" : [ {
"userId" : "1bec4119-a889-4809-89e9-c4572dc002ec",
"userName" : "jdoe@equinix.com"
} ]
},
"role" : {
"description" : "Provides information about the role associated with the log event, which determines what permissions\n are allowed. If the principal has access to multiple roles, this indicates the one they assumed when making the\n request.",
"type" : "object",
"properties" : {
"roleName" : {
"description" : "The human-friendly display name for the role.",
"type" : "string",
"examples" : [ "collaborator" ]
}
},
"required" : [ "roleName" ],
"title" : "Role",
"examples" : [ {
"roleName" : "collaborator"
} ]
}
},
"required" : [ "authType", "user", "role" ],
"title" : "AuthInfo",
"examples" : [ {
"authType" : "user",
"user" : {
"userId" : "1bec4119-a889-4809-89e9-c4572dc002ec",
"userName" : "jdoe@equinix.com"
},
"role" : {
"roleName" : "collaborator"
}
} ]
},
"httpRequest" : {
"description" : "Provides details about the HTTP request associated with the log event, if there is one (for now, there\n will always be one).",
"type" : "object",
"properties" : {
"host" : {
"description" : "The hostname to which the original HTTP request was made.",
"type" : "string",
"examples" : [ "api.equinix.com" ]
},
"method" : {
"description" : "The HTTP request method.",
"type" : "string",
"examples" : [ "PUT" ]
},
"path" : {
"description" : "The path portion of the original HTTP request URL.",
"type" : "string",
"examples" : [ "/metal/v1/projects/99f8e7f1-fe4a-441a-ade9-687743f080f6" ]
},
"scheme" : {
"description" : "The HTTP request scheme",
"type" : "string",
"enum" : [ "http", "https" ]
},
"statusCode" : {
"description" : "The HTTP status code that resulted from the processing of the request.",
"type" : "integer",
"examples" : [ 200 ]
},
"userAgent" : {
"description" : "The user-agent that issued the request, as reported by the HTTP client.",
"type" : "string",
"examples" : [ "metal-cli/metal equinix-sdk-go/0.30.0" ]
},
"sourceIpAddress" : {
"description" : "The IP address from which the HTTP request was sent.",
"type" : "string",
"examples" : [ "111.111.111.11" ]
}
},
"required" : [ "host", "method", "path", "scheme", "statusCode", "userAgent", "sourceIpAddress" ],
"title" : "HttpRequest",
"examples" : [ {
"host" : "api.equinix.com",
"method" : "PUT",
"path" : "/metal/v1/projects/99f8e7f1-fe4a-441a-ade9-687743f080f6",
"scheme" : "https",
"statusCode" : 200,
"userAgent" : "metal-cli/metal equinix-sdk-go/0.30.0",
"sourceIpAddress" : "111.111.111.11"
} ]
},
"resource" : {
"description" : "The resource associated with the request (for future use)",
"type" : "object",
"properties" : { },
"examples" : [ { } ]
},
"request" : {
"description" : "Detailed request parameters (for future use)",
"type" : "object",
"properties" : { },
"examples" : [ { } ]
},
"response" : {
"description" : "Detailed response body (for future use)",
"type" : "object",
"properties" : { },
"examples" : [ { } ]
}
},
"required" : [ "eventName", "status", "auth", "httpRequest" ],
"title" : "Event",
"examples" : [ {
"eventName" : "project_updated",
"status" : "unauthorized",
"auth" : {
"authType" : "user",
"user" : {
"userId" : "1bec4119-a889-4809-89e9-c4572dc002ec",
"userName" : "jdoe@equinix.com"
},
"role" : {
"roleName" : "collaborator"
}
},
"httpRequest" : {
"host" : "api.equinix.com",
"method" : "PUT",
"path" : "/metal/v1/projects/99f8e7f1-fe4a-441a-ade9-687743f080f6",
"scheme" : "http",
"statusCode" : 200,
"userAgent" : "metal-cli/metal equinix-sdk-go/0.30.0",
"sourceIpAddress" : "111.111.111.11"
},
"resource" : { },
"response" : { }
} ]
}
},
"required" : [ "stream", "source", "schema", "timestamp", "level", "eventId", "event" ],
"title" : "LogEntry",
"examples" : [ {
"stream" : {
"streamId" : "b47f2eaf-d5c6-485c-a081-5d12333aa2e2",
"streamName" : "Example Stream"
},
"source" : {
"category" : "validation",
"type" : "validation_request",
"service" : "metal",
"organizationId" : "a2337a57-4ad0-4708-abc6-c0973055c91e"
},
"schema" : "v1",
"timestamp" : "2024-04-16T14:58:21.442334Z",
"level" : "INFO",
"eventId" : "e6de0ec4-027e-4733-aeb4-058c1fc53493",
"event" : {
"eventName" : "instance_provision_requested",
"status" : "unauthorized",
"auth" : {
"authType" : "user",
"user" : {
"userId" : "1bec4119-a889-4809-89e9-c4572dc002ec",
"userName" : "jdoe@equinix.com"
},
"role" : {
"roleName" : "collaborator"
}
},
"httpRequest" : {
"host" : "api.equinix.com",
"method" : "PUT",
"path" : "/metal/v1/projects/99f8e7f1-fe4a-441a-ade9-687743f080f6",
"scheme" : "http",
"statusCode" : 200,
"userAgent" : "metal-cli/metal equinix-sdk-go/0.30.0",
"sourceIpAddress" : "111.111.111.11"
},
"response" : { }
}
} ]
}