Flux d'événements
!!! Info "Avis"
Les fonctionnalités d' Equinix Metal Observability sont actuellement en version bêta et ne sont pas disponibles pour tous les clients. Elles sont uniquement destinées à l'évaluation et aux tests. Cette fonctionnalité n'est actuellement ni facturée ni couverte par un contrat de niveau de service.
Vous pouvez surveiller des données d'événements et d'activités spécifiques de vos organisations Metal en quasi-temps réel grâce aux flux d'événements. Ces flux peuvent fournir des données critiques pour vous aider à comprendre et analyser vos besoins métier. Ces événements incluent:
- Événements de compte et d'organisation
- Services et événements de facturation
- Événements de gestion des appareils
- Événements de gestion de réseautage
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 des flux d'observabilité sont envoyées à Splunk par l'interface [Collecteur d'événements HTTP Splunk (« HEC »). Pour recevoir ces données, vous devez configurer un collecteur d'événements HTTP dans votre instance Splunk. Nous recommandons de créer un collecteur dédié à la réception des données des flux d'observabilité.
L'envoi de données de flux d'observabilité à Splunk est soumis aux limitations suivantes:
- Pour garantir le chiffrement des données en transit, seules les connexions HTTPS sont autorisées. L'envoi de données à un HEC Splunk via un protocole HTTP simple et 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 URL de points de terminaison alternatifs ne sont PAS prises en charge. - Les événements JSON seront envoyés à l'index par défaut configuré lors de la création du collecteur d'événements HTTP Splunk. Le remplacement de l'index des événements envoyés à Splunk n'est PAS pris 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 certaines différences entre celle-ci et l'API Equinix Metal actuelle.
- nouveaux points de terminaison d'API
- nouveau mécanisme d'authentification
Tout d’abord, Observability possède ses propres points de terminaison d’API qui peuvent être atteints à https://observability.equinixmetal.net.
Deuxièmement, l'API d'observabilité dispose d'un mécanisme d'authentification où vous échangez votre clé API Equinix Metal (../identity-access-management/api-keys.mdx) contre un jeton Web JSON (JWT) à durée de vie limitée. Ce jeton vous sert à authentifier toutes les requêtes d'observabilité. Il expire après 5 minutes. Pour obtenir 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 requêtes auprès de l'API Observability.
{
"access_token": "eyJ....98"
}
L'API d'observabilité n'accepte pas les clés API 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:
-
Rendez-vous sur [Portail Equinix Metal et entrez vos identifiants pour vous connecter au portail.
-
Dans le menu déroulant Organisation, sélectionnez l'organisation pour laquelle vous souhaitez créer un flux d'événements.
-
Cliquez sur l'onglet Observabilité.

-
Cliquez, Créer un flux d'événements.
-
Dans la fenêtre modale Créer un flux d'événements, entrez un nom convivial dans le champ Nom.
-
Optionnel. Entrez 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 fournis pour envoyer des données à Splunk.
Le nom d'hôte de la connexion doit être extrait de l'URI du collecteur d'événements HTTP (https://docs.splunk.com/Documentation/Splunk/latest/Data/UsetheHTTPEventCollector#Send_data_to_HTTP_Event_Collector). Il doit être spécifié comme une chaîne de caractères, suivie éventuellement d'un numéro de port ; les valeurs valides sont
http-inputs-my-org.splunkcloud.comousplunk.example.com:8443.La clé API doit être le jeton du collecteur d'événements HTTP généré lors de la création du point de terminaison HEC Splunk. Elle sera stockée dans un format chiffré, déchiffrable uniquement par le worker 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.
Tester la connexion au flux
- Console
- API
Avant de diffuser une connexion de données vers Splunk, vous devez la tester pour garantir sa validité. Pour ce faire, procédez comme suit:
-
Dans la fenêtre modale Créer un flux d'événements, 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, Testez la connexion au flux.
La connexion est valide si le message Test réussi s'affiche à l'écran. Un message d'erreur s'affiche si le test de connexion échoue. Vous devez recevoir le message Test réussi pour que la connexion de test soit valide et permette de diffuser des données vers Splunk.

-
Cliquez sur Enregistrer pour sauvegarder le flux de l'événement. 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 de terminaison 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 à partir de l'onglet Observabilité de votre organisation.

Pour obtenir la liste de tous les flux d'observabilité configurés pour l'organisation indiquée, envoyez une requête GET à l'adresse /v1/organizations/{org-id}/streams.%7Borg-id%7D~1streams/get) point de terminaison.
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: vous ne pouvez pas mettre à jour les valeurs des champs sensibles tels que les clés API de connexion à l’aide de cette méthode ; 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 ce faire, procédez comme suit:
-
Dans le tableau Flux d'événements, cliquez sur l'icône de la corbeille dans la colonne Supprimer. La fenêtre Supprimer le flux d'événements s'affiche.
-
Entrez Supprimer dans le champ et cliquez sur Supprimer.
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}"
Une fois un flux supprimé, il cesse immédiatement d'accepter de nouvelles données provenant des sources, mais continue de diffuser les données en cours. Une fois toutes les données en cours diffusé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 [métadonnées d'événement Splunk 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 d'observabilité définit les champs d'index personnalisés suivants pour chaque événement de journal envoyé à 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 collecteur d'événements HTTP Splunk en tant que "Données d'événement" est un document JSON structuré contenant des informations propres à l'application sur les événements enregistrés.
Pour une référence complète, consultez la Documentation du schéma d'événements 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" : { }
}
} ]
}