Flux d'événements
! !! Info "Avis"
Les fonctionnalités d'observabilité d'Equinix Metal sont actuellement en version bêta et ne sont pas disponibles pour tous les clients. Elles sont destinées à être évaluées et testées uniquement. Cette fonctionnalité n'est actuellement pas facturée et n'est pas couverte par un accord de niveau de service.
Vous pouvez surveiller des événements spécifiques et des données d'activité de vos organisations Metal en temps quasi réel à l'aide de flux d'événements. Les flux d'événements peuvent fournir des données d'événements critiques pour vous aider à comprendre et à analyser les besoins de votre entreprise. Ces événements sont les suivants
- Événements relatifs aux comptes et aux organisations
- Services et événements de facturation
- Événements relatifs à la gestion des appareils
- Événements de gestion de réseau
Les flux d'événements ne sont visibles que par les propriétaires et les administrateurs d'une organisation.
Limites
Actuellement, les flux d'événements ne prennent en charge que Splunk comme destination. Les données du flux d'observabilité sont envoyées à Splunk via l'interface [Splunk HTTP Event Collector ("HEC"). Pour recevoir les données Observability Stream, vous devez d'abord configurer un collecteur d'événements HTTP dans votre instance Splunk. Nous vous recommandons de créer un collecteur dédié spécifiquement à la réception des données Observability Stream.
L'envoi de données Observability Stream à Splunk est soumis aux limitations suivantes :
- Pour garantir le cryptage des données en transit, seules les connexions HTTPS sont autorisées. L'envoi de données à un Splunk HEC à l'aide d'un simple HTTP non sécurisé n'est PAS pris en charge.
- Toutes les données du flux d'observabilité sont envoyées à Splunk sous forme d'événements JSON ; les données brutes ne sont PAS prises en charge.
- Les événements JSON seront envoyés au point de terminaison standard
/services/collector/event; les autres URL de point de terminaison ne sont PAS prises en charge. - Les événements JSON seront envoyés à l'index par défaut qui a été configuré lors de la création du collecteur d'événements HTTP Splunk. La modification de l'index des événements envoyés à Splunk n'est PAS prise en charge.
- L'accusé de réception de l'indexeur n'est PAS pris en charge.
L'API d'observabilité
Si vous utilisez l'API Observability, vous devez noter quelques différences entre celle-ci et l'API Metal actuelle d'Equinix.
- nouveaux points d'accès à l'API
- nouveau mécanisme d'authentification
Tout d'abord, Observability dispose de ses propres points d'extrémité API, accessibles à l'adresse https://observability.equinixmetal.net.
Deuxièmement, l'API Observability dispose d'un mécanisme d'authentification dans lequel vous échangez votre clé API Equinix Metal contre un jeton web JSON de courte durée (JWT) que vous utilisez à des fins d'authentification pour toutes les demandes d'observabilité. Le jeton expire au bout de 5 minutes. Pour récupérer un JWT, envoyez une requête POST au point de terminaison iam.metalctrl.io/api-keys/exchange.
curl -X POST \
-H "Authorization: bearer <API_TOKEN>" \
https://iam.metalctrl.io/api-keys/exchange
La réponse sera un JSON "access_token" que vous utiliserez pour authentifier vos demandes à l'API Observability.
{
"access_token": "eyJ....98"
}
L'API Observability n'accepte pas les clés API d'Equinix Metal pour l'authentification.
Création d'un flux d'événements
- Console
- API
Créez un flux d'événements pour exporter les données du serveur vers Splunk à des fins de stockage et d'analyse. Pour créer un flux, procédez comme suit :
-
Allez sur [Equinix Metal Portal et entrez vos identifiants pour vous connecter au portail.
-
Dans le menu déroulant Organisation's, sélectionnez l'organisation pour laquelle vous souhaitez créer un flux d'événements.
-
Cliquez sur l'onglet Observabilité.

-
Cliquez sur Create Event Stream (Créer un flux d'événements).
-
Dans la fenêtre modale Create Event Stream, saisissez un nom convivial dans le champ Name.
-
En option. Saisissez une description du flux d'événements dans le champ de description.
-
Saisissez votre nom d'hôte Splunk et votre clé API dans les champs prévus à cet effet pour envoyer des données à Splunk.
Le nom d'hôte de la connexion doit provenir de l'URI du [HTTP Event Collector] (https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector#Send_data_to_HTTP_Event_Collector). Le nom d'hôte doit être spécifié sous forme de chaîne avec un suffixe facultatif de numéro de port ; les valeurs valides sont
http-inputs-my-org.splunkcloud.comousplunk.example.com:8443.La clé API doit être le jeton HTTP Event Collector qui a été généré lors de la création du point de terminaison Splunk HEC. Elle sera stockée dans un format crypté qui ne pourra être décrypté que par le travailleur qui envoie les données du flux d'observabilité.
Vous pouvez créer un nouveau flux en envoyant une requête POST au point de terminaison /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>"
}
Paramètres du corps :
"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.
Vérification de la connexion au flux
- Console
- API
Avant de transmettre une connexion de données à Splunk, vous devez la tester pour vous assurer de sa validité. Pour tester la connexion de flux, procédez comme suit :
-
Dans la fenêtre modale Create Event Stream, entrez votre nom d'hôte Splunk et votre clé API dans les champs prévus à cet effet, si vous ne l'avez pas déjà fait.
-
Cliquez sur Test Stream Connection.
La connexion est valide si le message Test Passed s'affiche à l'écran. Un message d'erreur s'affiche si le test de connexion n'est PAS réussi. Vous devez recevoir un message Test Passed pour vous assurer que la connexion de test est valide pour transmettre des données à Splunk.

-
Cliquez sur Save pour enregistrer le flux d'événements. Le flux d'événements est enregistré dans le tableau Flux d'événements de la page Observabilité.
Vous pouvez tester une nouvelle connexion de flux en envoyant une requête POST au point d'extrémité 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>"
}
Paramètres du corps :
"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.
Gestion d'un flux d'événements
- Console
- API
Une fois le flux d'événements créé dans la console Metal, vous pouvez le gérer depuis l'onglet Observabilité de votre organisation.

Pour obtenir une liste de tous les flux d'observabilité configurés pour l'organisation fournie, envoyez une requête GET au point de terminaison /v1/organizations/{org-id}/streams.
curl -X GET \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams"
Pour récupérer les détails de configuration du flux fourni en fonction de son propriétaire et de son ID, envoyez une requête GET au point de terminaison /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}"
Pour mettre à jour la configuration d'un flux d'observabilité existant, envoyez une requête PUT au point de terminaison /v1/organizations/{org-id}/streams/{stream-id}.
Remarque : cette méthode ne permet pas de mettre à jour les valeurs des champs sensibles tels que les clés API de connexion ; vous devez supprimer le flux et le recréer à l'aide de la nouvelle valeur.
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>"
}
}'
Suppression d'un flux d'événements
- Console
- API
Pour arrêter le flux de données vers votre instance Splunk, vous pouvez supprimer le flux d'événements. Pour supprimer un flux d'événements, procédez comme suit :
-
Dans le tableau Flux d'événements, cliquez sur l'icône de la corbeille de la colonne Delete. La fenêtre Supprimer le flux d'événements s'affiche.
-
Saisissez Delete dans le champ et cliquez sur Delete.
Dans l'API, vous pouvez supprimer un flux en envoyant une requête DELETE au point de terminaison /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}"
Lorsqu'un flux est supprimé, il cesse immédiatement d'accepter de nouvelles données en provenance de sources, mais continue à fournir des données en cours de traitement. Une fois que toutes les données en vol ont été livrées, le flux est supprimé et toutes les ressources sont libérées.
Métadonnées d'événements Splunk
Le service d'observabilité définit les clés [Splunk Event metadata suivantes pour chaque événement de journal d'audit qu'il envoie à votre flux :
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.
Champs d'index
En plus des clés de métadonnées Splunk standard décrites ci-dessus, le service Observability définit les champs d'index personnalisés suivants pour chaque événement de journal qu'il envoie à votre flux. Ces champs sont facultatifs et seront omis s'ils sont absents.
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).
Données d'événement Splunk
Le contenu de la clé event envoyée au Splunk HTTP Event Collector en tant que "Event data" est un document JSON structuré avec des informations spécifiques à l'application sur les événements enregistrés.
Pour une référence complète, reportez-vous à la Documentation Splunk Event Schema.
- 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" : { }
}
} ]
}