Transmissões de eventos
!!! Informações "Aviso"
Os características de observabilidade do Equinix Metal estão atualmente em fase Beta e não estão disponíveis para todos os clientes. O objetivo é apenas avaliar e testar. Atualmente, este recurso não é cobrado e não está coberto por um SLA.
Você pode monitorar dados específicos de eventos e atividades das suas organizações Metal quase em tempo real usando fluxos de eventos. Os fluxos de eventos podem fornecer dados de eventos essenciais para ajudar você a entender e analisar as necessidades do seu negócio. Esses eventos incluem:
- Eventos de conta e organização
- Serviços e eventos de cobrança
- Eventos de gerenciamento de dispositivos
- Eventos de Gestão de Redes
Os fluxos de eventos são visíveis apenas para proprietários e administradores de uma organização.
Limitações
Atualmente, o fluxo de eventos suporta apenas o Splunk como destino. Os dados do fluxo de observabilidade são enviados para o Splunk por meio da interface do Coletor de Eventos HTTP do Splunk ("HEC"). Para receber dados do fluxo de observabilidade, você deve primeiro configurar um Coletor de Eventos HTTP em sua instância do Splunk. Recomendamos a criação de um coletor dedicado especificamente para receber dados do fluxo de observabilidade.
O envio de dados do Observability Stream para o Splunk está sujeito às seguintes limitações:
- Para garantir a criptografia dos dados em trânsito, apenas conexões HTTPS são permitidas. O envio de dados para um HEC Splunk usando HTTP simples e desprotegido NÃO é suportado.
- Todos os dados do Observability Stream são enviados ao Splunk como eventos JSON; dados brutos NÃO são suportados.
- Os eventos JSON serão enviados para o endpoint padrão
/services/collector/event; URLs de endpoint alternativos NÃO são suportados. - Os eventos JSON serão enviados para o índice padrão configurado ao criar o Coletor de Eventos HTTP do Splunk. A substituição do índice de eventos enviados para o Splunk NÃO é suportada.
- O reconhecimento do indexador NÃO é suportado.
A API de Observabilidade
Se você estiver usando a API de Observabilidade, você algumas diferenças entre ela e a API Equinix Metal .
- novos endpoints de API
- novo mecanismo de autenticação
Primeiro, o Observability tem seus próprios endpoints de API que podem ser acessados em https://observability.equinixmetal.net.
Em segundo lugar, a API de Observabilidade possui um mecanismo de autenticação onde você troca sua chave da API Equinix Metal por um token web JSON (JWT) de curta duração que você usa para autenticação em todas as solicitações de observabilidade. O token expira após 5 minutos. Para obter um JWT, envie uma solicitar POST para o endpoint iam.metalctrl.io/api-keys/exchange.
curl -X POST \
-H "Authorization: bearer <API_TOKEN>" \
https://iam.metalctrl.io/api-keys/exchange
A resposta será um JSON "access_token" que você usa para autenticar suas solicitações à API de Observabilidade.
{
"access_token": "eyJ....98"
}
A API Observability não aceita chaves da API Equinix Metal para autenticação.
Criando um fluxo de eventos
- Console
- API
Crie um fluxo de eventos para exportar dados do servidor para o Splunk para armazenamento e análise. Para criar um fluxo, faça o seguinte:
-
Acesse o Portal Equinix Metal e insira suas credenciais para entrar no portal.
-
No menu suspenso Organização, selecione a organização para a qual deseja criar um fluxo de eventos.
-
Clique na aba Observabilidade.

-
Clique em Criar Fluxo de Eventos.
-
Na janela modal Criar Fluxo de Eventos, insira um nome amigável no campo Nome.
-
Opcional. Insira uma descrição para o fluxo de eventos no campo de descrição.
-
Insira o nome do host e a chave da API do Splunk nos campos fornecidos para enviar dados ao Splunk.
O nome do host de conexão deve ser obtido do [URI do coletor de eventos HTTP. O nome do host deve ser especificado como uma string com um sufixo opcional de número de porta; os valores válidos incluem
http-inputs-my-org.splunkcloud.comousplunk.example.com:8443.A chave de API deve ser o token do Coletor de Eventos HTTP gerado ao criar o endpoint HEC do Splunk. Ele será armazenado em um formato criptografado que só pode ser descriptografado pelo trabalhador que envia os dados do Observability Stream.
Você pode criar um novo fluxo enviando uma solicitar POST para o endpoint /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 corporais:
"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.
Testando a conexão do fluxo
- Console
- API
Antes de transmitir uma conexão de dados para o Splunk, você precisa testá-la para garantir sua validade. Para testar a conexão de transmissão, faça o seguinte:
-
Na janela modal Criar Fluxo de Eventos, insira o nome do host e a chave da API do Splunk nos campos fornecidos, caso ainda não o você feito.
-
Clique em Testar conexão de streaming.
A conexão é válida se a mensagem Teste Aprovado aparecer na tela. Uma mensagem de erro será exibida se o teste de conexão NÃO for bem-sucedido. Você precisa receber a mensagem Teste Aprovado para garantir que a conexão de teste seja válida para transmitir dados para o Splunk.

-
Clique em Salvar para salvar o fluxo do evento. O fluxo de eventos é salvo na tabela Fluxos de Eventos na página de Observabilidade.
Você pode testar uma nova conexão de fluxo enviando uma solicitar POST para o endpoint 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 corporais:
"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.
Gerenciando um fluxo de eventos
- Console
- API
Após a criação do fluxo de eventos no console do Metal, você poderá gerenciá-lo na guia Observability da sua organização.

Para obter uma lista de todos os fluxos de observabilidade configurados para a organização fornecida, envie uma solicitar GET para [/v1/organizations/{org-id}/streams](htps://observability.equinixmetal.net/observability-api.html#tag/Observability-Streams/paths/1v11organizations1%7Borg-id%endpoint 7D1streams/get.
curl -X GET \
-H "Authorization: bearer <API_TOKEN>" \
"https://observability.equinixmetal.net/v1/organizations/{org-id}/streams"
Para recuperar os detalhes de configuração do fluxo fornecido com base em seu proprietário e ID, envie uma solicitar GET para o endpoint /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 atualizar a configuração de um fluxo de observabilidade existente, envie uma solicitar PUT para o endpoint /v1/organizations/{org-id}/streams/{stream-id}.
Observação: não é possível atualizar os valores de campos confidenciais, como chaves de API de conexão, usando esse método; você deve excluir o fluxo e recriá-lo usando o novo 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>"
}
}'
Excluindo um fluxo de eventos
- Console
- API
Para interromper o fluxo de dados para sua instância do Splunk, você pode excluir o fluxo de eventos. Para excluir um fluxo de eventos, faça o seguinte:
-
Na tabela Fluxos de Eventos, clique no ícone da lixeira na coluna Excluir. A janela Excluir fluxo de eventos é exibida.
-
Digite Excluir no campo e clique em Excluir.
Na API, você pode excluir um fluxo enviando uma solicitar DELETE para o endpoint /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}"
Após a exclusão de um fluxo, ele para imediatamente de aceitar novos dados de fontes, mas continua entregando dados em voo. Assim que todos os dados em voo forem entregues, o fluxo é excluído e todos os recursos são liberados.
Metadados de eventos do Splunk
O Serviço de Observabilidade define as seguintes chaves de [metadados de evento do Splunk para cada evento de log de auditoria que envia para o seu fluxo:
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
Além das chaves de metadados padrão do Splunk descritas acima, o Serviço de Observabilidade define os seguintes campos de índice personalizados para cada evento de log enviado ao seu fluxo. Esses campos são opcionais e serão omitidos se 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).
Dados de eventos do Splunk
O conteúdo da chave event enviada ao coletor de eventos HTTP do Splunk como "Dados do evento" é um documento JSON estruturado com informações específicas do aplicativo sobre os eventos que estão sendo registrados.
Para obter uma referência completa, consulte a Documentação do Esquema de Eventos do 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" : { }
}
} ]
}