Files
o11y/integrations.go
zeekayandHanzo Dev cae99adb44 The relay reads the operation zip served
An op learns its address from zip.OpOf and zip.AddressOf, so the claim table,
the five declaring verbs and the address bookkeeping are gone. A host that
declares one of these addresses itself now gets a Build conflict from zip.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-17 15:02:30 -07:00

598 lines
26 KiB
Go

package o11y
// The INTEGRATIONS face — the integration catalog and its install lifecycle,
// the cloud-integrations account/service surface, the gateway ingestion keys
// and their limits, and the Zeus deployment profile/host writes — as TYPED
// ops.
//
// These twenty-nine routes reached traffic only through the /v1/o11y
// delegation wildcard, and a route behind a wildcard is in no document: no SDK
// method, no CLI command, no agent tool, no reference page. A workspace could
// install an integration, connect an AWS account, mint an ingestion key or
// report a deployment profile only from a hand-written HTTP call. Typing the
// face is what puts the operations in the document and therefore in every
// projection built from it.
//
// THE WIRE DOES NOT MOVE, the same way telemetry.go's and infra.go's ops do
// not move it: no op here re-implements a handler. Each hands the call to the
// SAME runtime handler the wildcard delegates to (see integrationsRelay), so
// identity resolution, the org gate, the ROLE CHECK the mux registration
// declared and the success envelope are all still the runtime's, executed in
// the order they always were. Every route carried its gate on mux and still
// does, one layer in:
//
// - cloud-integrations account/service ops (cloudintegration.go): AdminAccess
// - the two agent check-ins (cloudintegration.go): ViewAccess (agent = viewer)
// - gateway ingestion keys and limits (gateway.go): EditAccess
// - Zeus PutProfile / PutHost (zeus.go): AdminAccess; GetHosts: ViewAccess
// - integration catalog + install lifecycle (routes_integrations.go): ViewAccess
//
// The gate is not re-stated here because it is not enforced here; each op's
// comment names the gate its route has always had, and the runtime keeps
// enforcing it — its IdentN middleware rebuilds the caller's claims from the
// forwarded identity headers, and AdminAccess/EditAccess/ViewAccess resolve the
// role from those claims exactly as before.
//
// The request and response payloads are the RUNTIME'S OWN types
// (pkg/types/cloudintegrationtypes, pkg/types/gatewaytypes, pkg/types/zeustypes,
// pkg/query-service/app/integrations), not mirrors of them: the field list that
// decodes a request here is the field list the handler decodes one layer in, so
// the two cannot drift, and a field the runtime grows flows through without this
// file changing. Only the {status, data} envelopes, the id/parameter carriers a
// path spells, and the GET query shapes are NAMED here, because the runtime
// spells those on the wire rather than in a type.
import (
"context"
"net/http"
"github.com/hanzoai/o11y/pkg/query-service/app/integrations"
citypes "github.com/hanzoai/o11y/pkg/types/cloudintegrationtypes"
"github.com/hanzoai/o11y/pkg/types/gatewaytypes"
"github.com/hanzoai/o11y/pkg/types/zeustypes"
"github.com/zap-proto/zip"
)
// mountIntegrations registers the integrations face's typed ops on the native
// router. Static segments sit beside their parameterised siblings safely — the
// router matches the most specific pattern, so /integrations/install can never
// be swallowed by /integrations/:integrationId, the same disambiguation the
// runtime's own mux tree makes.
func mountIntegrations(app *zip.App) {
g := app.Group(o11yRoot)
// integration catalog and install lifecycle (runtime gate: ViewAccess)
g.Get("/integrations", listIntegrations, zip.WithOperationID("ListIntegrations"))
g.Get("/integrations/:integrationId", getIntegration, zip.WithOperationID("GetIntegration"))
g.Get("/integrations/:integrationId/connection_status", getIntegrationConnectionStatus, zip.WithOperationID("GetIntegrationConnectionStatus"))
g.Post("/integrations/install", installIntegration, zip.WithOperationID("InstallIntegration"))
g.Post("/integrations/uninstall", uninstallIntegration, zip.WithOperationID("UninstallIntegration"))
// cloud integrations — accounts and services (runtime gate: AdminAccess)
g.Get("/cloud_integrations/:cloud_provider/credentials", getConnectionCredentials, zip.WithOperationID("GetConnectionCredentials"))
g.Post("/cloud_integrations/:cloud_provider/accounts", createAccount, zip.WithStatus(http.StatusCreated), zip.WithOperationID("CreateAccount"))
g.Get("/cloud_integrations/:cloud_provider/accounts", listAccounts, zip.WithOperationID("ListAccounts"))
g.Get("/cloud_integrations/:cloud_provider/accounts/:id", getAccount, zip.WithOperationID("GetAccount"))
g.Put("/cloud_integrations/:cloud_provider/accounts/:id", updateAccount, zip.WithOperationID("UpdateAccount"))
g.Delete("/cloud_integrations/:cloud_provider/accounts/:id", disconnectAccount, zip.WithOperationID("DisconnectAccount"))
g.Get("/cloud_integrations/:cloud_provider/services", listServicesMetadata, zip.WithOperationID("ListServicesMetadata"))
g.Get("/cloud_integrations/:cloud_provider/accounts/:id/services", listAccountServicesMetadata, zip.WithOperationID("ListAccountServicesMetadata"))
g.Get("/cloud_integrations/:cloud_provider/services/:service_id", getService, zip.WithOperationID("GetService"))
g.Put("/cloud_integrations/:cloud_provider/accounts/:id/services/:service_id", updateService, zip.WithOperationID("UpdateService"))
g.Get("/cloud_integrations/:cloud_provider/accounts/:id/services/:service_id", getAccountService, zip.WithOperationID("GetAccountService"))
// The deprecated agent check-in keeps its hyphenated path for the agents
// already deployed against it; the check_in path below is its replacement.
g.Post("/cloud-integrations/:cloud_provider/agent-check-in", agentCheckInDeprecated, zip.WithOperationID("AgentCheckInDeprecated"))
g.Post("/cloud_integrations/:cloud_provider/accounts/check_in", agentCheckIn, zip.WithOperationID("AgentCheckIn"))
// gateway ingestion keys and their limits (runtime gate: EditAccess)
g.Get("/gateway/ingestion_keys", getIngestionKeys, zip.WithOperationID("GetIngestionKeys"))
g.Get("/gateway/ingestion_keys/search", searchIngestionKeys, zip.WithOperationID("SearchIngestionKeys"))
g.Post("/gateway/ingestion_keys", createIngestionKey, zip.WithStatus(http.StatusCreated), zip.WithOperationID("CreateIngestionKey"))
g.Patch("/gateway/ingestion_keys/:keyId", updateIngestionKey, zip.WithOperationID("UpdateIngestionKey"))
g.Delete("/gateway/ingestion_keys/:keyId", deleteIngestionKey, zip.WithOperationID("DeleteIngestionKey"))
g.Post("/gateway/ingestion_keys/:keyId/limits", createIngestionKeyLimit, zip.WithStatus(http.StatusCreated), zip.WithOperationID("CreateIngestionKeyLimit"))
g.Patch("/gateway/ingestion_keys/limits/:limitId", updateIngestionKeyLimit, zip.WithOperationID("UpdateIngestionKeyLimit"))
g.Delete("/gateway/ingestion_keys/limits/:limitId", deleteIngestionKeyLimit, zip.WithOperationID("DeleteIngestionKeyLimit"))
// Zeus — deployment profile and host (runtime gate: AdminAccess writes, ViewAccess read)
g.Put("/zeus/profiles", putProfile, zip.WithOperationID("PutProfile"))
g.Get("/zeus/hosts", getHosts, zip.WithOperationID("GetHosts"))
g.Put("/zeus/hosts", putHost, zip.WithOperationID("PutHost"))
}
// ── integration catalog and install lifecycle ────────────────────────────────
// listIntegrations lists the available integrations and whether each is
// installed in the caller's org, optionally narrowed to installed or
// not-installed. Viewer gate.
func listIntegrations(ctx context.Context, in *O11yListIntegrationsIn) (*O11yIntegrationsListOut, error) {
out := new(O11yIntegrationsListOut)
return out, relay(ctx, query("is_installed", in.IsInstalled), nil, out)
}
// getIntegration returns one integration's full detail — its overview,
// configuration steps, collected data and assets — together with its
// installation record when the org has installed it. Viewer gate.
func getIntegration(ctx context.Context, in *O11yIntegrationRef) (*O11yIntegrationOut, error) {
out := new(O11yIntegrationOut)
return out, relay(ctx, nil, nil, out)
}
// getIntegrationConnectionStatus reports whether the integration's logs and
// metrics have been received over the lookback window, so the console can show
// a live connection state. An integration that is not installed answers with an
// empty status rather than an error. Viewer gate.
func getIntegrationConnectionStatus(ctx context.Context, in *O11yConnectionStatusIn) (*O11yConnectionStatusOut, error) {
out := new(O11yConnectionStatusOut)
return out, relay(ctx, query("lookback_seconds", in.LookbackSeconds), nil, out)
}
// installIntegration installs an integration into the caller's org from its id
// and configuration, answering with the installed catalog item. Viewer gate.
func installIntegration(ctx context.Context, in *integrations.InstallIntegrationRequest) (*O11yInstallOut, error) {
out := new(O11yInstallOut)
return out, relay(ctx, nil, in, out)
}
// uninstallIntegration removes an integration from the caller's org by id.
// Viewer gate.
func uninstallIntegration(ctx context.Context, in *integrations.UninstallIntegrationRequest) (*O11yIntegrationAck, error) {
out := new(O11yIntegrationAck)
return out, relay(ctx, nil, in, out)
}
// ── cloud integrations — accounts ─────────────────────────────────────────────
// getConnectionCredentials returns the credentials the connecting agent needs
// to establish the cloud integration, for the given cloud provider. Admin gate.
func getConnectionCredentials(ctx context.Context, in *O11yCloudProviderRef) (*O11yCredentialsOut, error) {
out := new(O11yCredentialsOut)
return out, relay(ctx, nil, nil, out)
}
// createAccount connects a new cloud-integration account for the given
// provider from its posted config and credentials, answering with the account
// and the artifact the agent deploys to complete the connection. Admin gate.
func createAccount(ctx context.Context, in *O11yCreateAccountIn) (*O11yCreateAccountOut, error) {
out := new(O11yCreateAccountOut)
return out, relay(ctx, nil, in, out)
}
// listAccounts lists the cloud-integration accounts connected for the given
// provider. Admin gate.
func listAccounts(ctx context.Context, in *O11yCloudProviderRef) (*O11yAccountsOut, error) {
out := new(O11yAccountsOut)
return out, relay(ctx, nil, nil, out)
}
// getAccount returns one connected account for the given provider, by id. Admin
// gate.
func getAccount(ctx context.Context, in *O11yAccountRef) (*O11yAccountOut, error) {
out := new(O11yAccountOut)
return out, relay(ctx, nil, nil, out)
}
// updateAccount changes a connected account's configuration for the given
// provider, by id. Admin gate.
func updateAccount(ctx context.Context, in *O11yUpdateAccountIn) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// disconnectAccount tears down a connected account for the given provider, by
// id. Admin gate.
func disconnectAccount(ctx context.Context, in *O11yAccountRef) (*struct{}, error) {
return nil, relay(ctx, nil, nil, nil)
}
// ── cloud integrations — services ─────────────────────────────────────────────
// listServicesMetadata lists the services the given provider can collect from,
// optionally scoped to one cloud integration. Admin gate.
func listServicesMetadata(ctx context.Context, in *O11yListServicesMetadataIn) (*O11yServicesMetadataOut, error) {
out := new(O11yServicesMetadataOut)
return out, relay(ctx, query("cloud_integration_id", in.CloudIntegrationID), nil, out)
}
// listAccountServicesMetadata lists the services metadata for one connected
// account of the given provider, by account id. Admin gate.
func listAccountServicesMetadata(ctx context.Context, in *O11yAccountRef) (*O11yServicesMetadataOut, error) {
out := new(O11yServicesMetadataOut)
return out, relay(ctx, nil, nil, out)
}
// getService returns one service the given provider can collect from, by
// service id, optionally scoped to one cloud integration. Admin gate.
func getService(ctx context.Context, in *O11yGetServiceIn) (*O11yServiceOut, error) {
out := new(O11yServiceOut)
return out, relay(ctx, query("cloud_integration_id", in.CloudIntegrationID), nil, out)
}
// updateService changes a service's configuration for one connected account of
// the given provider, by account id and service id. Admin gate.
func updateService(ctx context.Context, in *O11yUpdateServiceIn) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// getAccountService returns one service and its configuration for a connected
// account of the given provider, by account id and service id. Admin gate.
func getAccountService(ctx context.Context, in *O11yAccountServiceRef) (*O11yServiceOut, error) {
out := new(O11yServiceOut)
return out, relay(ctx, nil, nil, out)
}
// agentCheckInDeprecated is the deployed agent's check-in on its original
// hyphenated path, kept for backward compatibility with agents already
// running. Viewer gate — the agent's role is viewer.
func agentCheckInDeprecated(ctx context.Context, in *O11yAgentCheckInIn) (*O11yAgentCheckInOut, error) {
out := new(O11yAgentCheckInOut)
return out, relay(ctx, nil, in, out)
}
// agentCheckIn is the deployed agent's check-in — the path consistent with the
// account surface, reporting the agent's account and telemetry state so the
// connection can be tracked. Viewer gate — the agent's role is viewer.
func agentCheckIn(ctx context.Context, in *O11yAgentCheckInIn) (*O11yAgentCheckInOut, error) {
out := new(O11yAgentCheckInOut)
return out, relay(ctx, nil, in, out)
}
// ── gateway ingestion keys ────────────────────────────────────────────────────
// getIngestionKeys lists the workspace's ingestion keys, paginated. Editor
// gate.
func getIngestionKeys(ctx context.Context, in *O11yIngestionKeysIn) (*O11yIngestionKeysOut, error) {
out := new(O11yIngestionKeysOut)
return out, relay(ctx, query("page", in.Page, "per_page", in.PerPage), nil, out)
}
// searchIngestionKeys lists the workspace's ingestion keys whose name matches
// the search, paginated. Editor gate.
func searchIngestionKeys(ctx context.Context, in *O11ySearchIngestionKeysIn) (*O11yIngestionKeysOut, error) {
out := new(O11yIngestionKeysOut)
return out, relay(ctx, query("name", in.Name, "page", in.Page, "per_page", in.PerPage), nil, out)
}
// createIngestionKey mints an ingestion key for the workspace, answering with
// the created key. Editor gate.
func createIngestionKey(ctx context.Context, in *gatewaytypes.PostableIngestionKey) (*O11yCreatedIngestionKeyOut, error) {
out := new(O11yCreatedIngestionKeyOut)
return out, relay(ctx, nil, in, out)
}
// updateIngestionKey changes an ingestion key, by id. Editor gate.
func updateIngestionKey(ctx context.Context, in *O11yUpdateIngestionKeyIn) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// deleteIngestionKey removes an ingestion key, by id. Editor gate.
func deleteIngestionKey(ctx context.Context, in *O11yIngestionKeyRef) (*struct{}, error) {
return nil, relay(ctx, nil, nil, nil)
}
// createIngestionKeyLimit sets a signal limit on an ingestion key, by key id,
// answering with the created limit. Editor gate.
func createIngestionKeyLimit(ctx context.Context, in *O11yCreateLimitIn) (*O11yCreatedLimitOut, error) {
out := new(O11yCreatedLimitOut)
return out, relay(ctx, nil, in, out)
}
// updateIngestionKeyLimit changes an ingestion key limit, by limit id. Editor
// gate.
func updateIngestionKeyLimit(ctx context.Context, in *O11yUpdateLimitIn) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// deleteIngestionKeyLimit removes an ingestion key limit, by limit id. Editor
// gate.
func deleteIngestionKeyLimit(ctx context.Context, in *O11yLimitRef) (*struct{}, error) {
return nil, relay(ctx, nil, nil, nil)
}
// ── Zeus — deployment profile and host ────────────────────────────────────────
// putProfile records the deployment's profile in Zeus — how the team uses
// observability today and what they plan — overwriting any prior one. Admin
// gate.
func putProfile(ctx context.Context, in *zeustypes.PostableProfile) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// getHosts returns the deployment's host info from Zeus. Viewer gate.
func getHosts(ctx context.Context, _ *struct{}) (*O11yGettableHostOut, error) {
out := new(O11yGettableHostOut)
return out, relay(ctx, nil, nil, out)
}
// putHost records the deployment's host in Zeus, overwriting any prior one.
// Admin gate.
func putHost(ctx context.Context, in *zeustypes.PostableHost) (*struct{}, error) {
return nil, relay(ctx, nil, in, nil)
}
// ── inputs the URL carries ────────────────────────────────────────────────────
// O11yListIntegrationsIn narrows the catalog listing.
type O11yListIntegrationsIn struct {
// IsInstalled, when "true" or "false", keeps only integrations in that
// installed state; empty lists them all.
IsInstalled string `json:"is_installed"`
}
// O11yIntegrationRef names one integration by id.
type O11yIntegrationRef struct {
// IntegrationID is the integration's id.
IntegrationID string `json:"-" url:"integrationId" validate:"required"`
}
// O11yConnectionStatusIn names one integration and the window to report over.
type O11yConnectionStatusIn struct {
// IntegrationID is the integration's id.
IntegrationID string `json:"-" url:"integrationId" validate:"required"`
// LookbackSeconds is how far back to look for received telemetry, in
// seconds.
LookbackSeconds int `json:"lookback_seconds"`
}
// O11yCloudProviderRef names one cloud provider.
type O11yCloudProviderRef struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
}
// O11yAccountRef names one connected account under a cloud provider.
type O11yAccountRef struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// ID is the connected account's id.
ID string `json:"-" url:"id" validate:"required"`
}
// O11yAccountServiceRef names one service of one connected account.
type O11yAccountServiceRef struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// ID is the connected account's id.
ID string `json:"-" url:"id" validate:"required"`
// ServiceID is the service's id.
ServiceID string `json:"-" url:"service_id" validate:"required"`
}
// O11yListServicesMetadataIn scopes the provider's services listing.
type O11yListServicesMetadataIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// CloudIntegrationID, when set, scopes the listing to one cloud integration.
CloudIntegrationID string `json:"cloud_integration_id"`
}
// O11yGetServiceIn names one service under a provider, optionally scoped.
type O11yGetServiceIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// ServiceID is the service's id.
ServiceID string `json:"-" url:"service_id" validate:"required"`
// CloudIntegrationID, when set, scopes the service to one cloud integration.
CloudIntegrationID string `json:"cloud_integration_id"`
}
// O11yCreateAccountIn carries the provider in the path and the posted account
// in the body.
type O11yCreateAccountIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
citypes.PostableAccount
}
// O11yUpdateAccountIn carries the provider and account id in the path and the
// account's new config in the body.
type O11yUpdateAccountIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// ID is the connected account's id.
ID string `json:"-" url:"id" validate:"required"`
citypes.UpdatableAccount
}
// O11yUpdateServiceIn carries the provider, account id and service id in the
// path and the service's new config in the body.
type O11yUpdateServiceIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
// ID is the connected account's id.
ID string `json:"-" url:"id" validate:"required"`
// ServiceID is the service's id.
ServiceID string `json:"-" url:"service_id" validate:"required"`
citypes.UpdatableService
}
// O11yAgentCheckInIn carries the provider in the path and the agent's check-in
// in the body.
type O11yAgentCheckInIn struct {
// CloudProvider is the cloud provider — aws, azure or gcp.
CloudProvider string `json:"-" url:"cloud_provider" validate:"required"`
citypes.PostableAgentCheckIn
}
// O11yIngestionKeysIn paginates the ingestion-key listing.
type O11yIngestionKeysIn struct {
// Page is the 1-based page number.
Page int `json:"page"`
// PerPage is the page size.
PerPage int `json:"per_page"`
}
// O11ySearchIngestionKeysIn names and paginates the ingestion-key search.
type O11ySearchIngestionKeysIn struct {
// Name is the substring to match ingestion-key names against.
Name string `json:"name"`
// Page is the 1-based page number.
Page int `json:"page"`
// PerPage is the page size.
PerPage int `json:"per_page"`
}
// O11yIngestionKeyRef names one ingestion key by id.
type O11yIngestionKeyRef struct {
// KeyID is the ingestion key's id.
KeyID string `json:"-" url:"keyId" validate:"required"`
}
// O11yUpdateIngestionKeyIn carries the key id in the path and the key's new
// fields in the body.
type O11yUpdateIngestionKeyIn struct {
// KeyID is the ingestion key's id.
KeyID string `json:"-" url:"keyId" validate:"required"`
gatewaytypes.PostableIngestionKey
}
// O11yCreateLimitIn carries the key id in the path and the posted limit in the
// body.
type O11yCreateLimitIn struct {
// KeyID is the ingestion key's id.
KeyID string `json:"-" url:"keyId" validate:"required"`
gatewaytypes.PostableIngestionKeyLimit
}
// O11yUpdateLimitIn carries the limit id in the path and the limit's new fields
// in the body.
type O11yUpdateLimitIn struct {
// LimitID is the ingestion key limit's id.
LimitID string `json:"-" url:"limitId" validate:"required"`
gatewaytypes.UpdatableIngestionKeyLimit
}
// O11yLimitRef names one ingestion key limit by id.
type O11yLimitRef struct {
// LimitID is the ingestion key limit's id.
LimitID string `json:"-" url:"limitId" validate:"required"`
}
// ── the {status, data} envelopes the runtime returns ─────────────────────────
// O11yIntegrationsListOut is the catalog listing.
type O11yIntegrationsListOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the available integrations and their installed state.
Data integrations.IntegrationsListResponse `json:"data,omitempty"`
}
// O11yIntegrationOut is one integration's full detail.
type O11yIntegrationOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the integration and its installation record.
Data integrations.Integration `json:"data,omitempty"`
}
// O11yConnectionStatusOut is an integration's live connection state.
type O11yConnectionStatusOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the logs and metrics connection status.
Data integrations.IntegrationConnectionStatus `json:"data,omitempty"`
}
// O11yInstallOut is the installed catalog item.
type O11yInstallOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the installed integration.
Data integrations.IntegrationsListItem `json:"data,omitempty"`
}
// O11yIntegrationAck acknowledges an uninstall.
type O11yIntegrationAck struct {
// Status is "success".
Status string `json:"status"`
}
// O11yCredentialsOut is the connecting agent's credentials.
type O11yCredentialsOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the connection credentials.
Data citypes.Credentials `json:"data,omitempty"`
}
// O11yCreateAccountOut is a newly connected account with its deploy artifact.
type O11yCreateAccountOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the account and the connection artifact.
Data citypes.GettableAccountWithConnectionArtifact `json:"data,omitempty"`
}
// O11yAccountsOut is the provider's connected accounts.
type O11yAccountsOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the connected accounts.
Data citypes.GettableAccounts `json:"data,omitempty"`
}
// O11yAccountOut is one connected account.
type O11yAccountOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the account.
Data citypes.Account `json:"data,omitempty"`
}
// O11yServicesMetadataOut is a provider's collectable services.
type O11yServicesMetadataOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the services metadata.
Data citypes.GettableServicesMetadata `json:"data,omitempty"`
}
// O11yServiceOut is one collectable service and its configuration.
type O11yServiceOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the service.
Data citypes.Service `json:"data,omitempty"`
}
// O11yAgentCheckInOut is the runtime's answer to an agent check-in.
type O11yAgentCheckInOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the check-in result.
Data citypes.GettableAgentCheckIn `json:"data,omitempty"`
}
// O11yIngestionKeysOut is the workspace's ingestion keys.
type O11yIngestionKeysOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the ingestion keys.
Data gatewaytypes.GettableIngestionKeys `json:"data,omitempty"`
}
// O11yCreatedIngestionKeyOut is a newly minted ingestion key.
type O11yCreatedIngestionKeyOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the created ingestion key.
Data gatewaytypes.GettableCreatedIngestionKey `json:"data,omitempty"`
}
// O11yCreatedLimitOut is a newly set ingestion key limit.
type O11yCreatedLimitOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the created limit.
Data gatewaytypes.GettableCreatedIngestionKeyLimit `json:"data,omitempty"`
}
// O11yGettableHostOut is the deployment's host info from Zeus.
type O11yGettableHostOut struct {
// Status is "success".
Status string `json:"status"`
// Data holds the host info.
Data zeustypes.GettableHost `json:"data,omitempty"`
}