Skip to main content

Service

A Service is a catalog entry for an external service that exposes callable APIs — an MCP server, a REST API, a GraphQL API, a gRPC service, and so on. A Service groups the APIs it exposes, carries the full interface definition, and sits between the Repository that produces it and the Applications/agents that consume it in the repo → service → api → app → dataset chain.

The specific kind of service is recorded with the standard subTypes aspect (e.g. MCP, REST_API, OPEN_API, GRPC). Note that a Service holds only catalog information (identity, description, interface); operational configuration such as authentication for DataHub's Ask DataHub integration lives separately in GlobalSettings.aiPlugins, not on the entity.

Identity

Services are identified by a single field:

  • id: A unique identifier for the service, such as glean-search, internal-tools, or weather-api.

An example URN is urn:li:service:glean-search.

Important Capabilities

Service Properties

The serviceProperties aspect holds catalog identity and the service's place in the graph:

  • displayName: Name shown in the UI and search results, searchable with autocomplete.
  • description: What the service provides.
  • lifecycle: Lifecycle stage — EXPERIMENTAL, PRODUCTION, or DEPRECATED — rendered as a badge so consumers can see at a glance whether the service is safe to depend on.
  • apis: The APIs this service composes/exposes (ServiceComposesApi). This is a lineage edge with the API downstream of the service, so endpoints nest correctly under their service.
  • sourceRepository: The Repository the service is produced from (SourcedFrom).

Service Definition

The serviceDefinition aspect carries the full interface document — the source of truth from which the operation-level API entities are parsed. It records:

  • format: How to parse rawSpecOPENAPI, GRAPHQL_SDL, GRPC_PROTO, ASYNCAPI, JSON_SCHEMA, or OTHER.
  • rawSpec: The entire spec document, verbatim. Stored as a LargeString (optionally compressed) so large specs fit under the aspect-size limit; readers receive the decompressed text. Rendered read-only on the service profile's Definition tab.
  • version / externalUrl: Optional spec version and a link to the canonical hosted source.

It is kept as its own aspect (rather than a field on serviceProperties) because the spec blob is large and only needed on the profile, whereas serviceProperties is fetched on every search card and header.

MCP Server Properties

For services of subtype MCP, the mcpServerProperties aspect holds connection details: the server url, the transport (HTTP, SSE, or WEBSOCKET), an optional connection timeout, and any non-auth customHeaders (e.g. X-Tenant-ID). Authentication headers are configured in GlobalSettings.aiPlugins, not here.

Health and Governance

Services surface operational health through the shared incidents subsystem (incidentsSummary) and support the standard ownership, tags, and status aspects.

Technical Reference Guide

The sections above provide an overview of how to use this entity. The following sections provide detailed technical information about how metadata is stored and represented in DataHub.

Aspects are the individual pieces of metadata that can be attached to an entity. Each aspect contains specific information (like ownership, tags, or properties) and is stored as a separate record, allowing for flexible and incremental metadata updates.

Relationships show how this entity connects to other entities in the metadata graph. These connections are derived from the fields within each aspect and form the foundation of DataHub's knowledge graph.

Reading the Field Tables

Each aspect's field table includes an Annotations column that provides additional metadata about how fields are used:

  • ⚠️ Deprecated: This field is deprecated and may be removed in a future version. Check the description for the recommended alternative
  • Searchable: This field is indexed and can be searched in DataHub's search interface
  • Searchable (fieldname): When the field name in parentheses is shown, it indicates the field is indexed under a different name in the search index. For example, dashboardTool is indexed as tool
  • → RelationshipName: This field creates a relationship to another entity. The arrow indicates this field contains a reference (URN) to another entity, and the name indicates the type of relationship (e.g., → Contains, → OwnedBy)

Fields with complex types (like Edge, AuditStamp) link to their definitions in the Common Types section below.

Aspects

serviceProperties

Common properties for all Service types.

A Service is a catalog entry for an external service (MCP server, REST API, etc.). This aspect contains identity and descriptive information. Subtype-specific properties are in separate aspects (e.g., McpServerProperties).

Note: This contains only catalog information (identity, description). Ask DataHub configuration (auth, instructions) is in GlobalSettings.aiPlugins.

FieldTypeRequiredDescriptionAnnotations
displayNamestringDisplay name shown in UI and search results.Searchable
descriptionstringDescription of what this service provides.Searchable
lifecycleServiceLifecycleLifecycle stage of the service, from experimental through production to deprecation. Rendered as ...Searchable
apisstring[]The APIs (callables) this service composes / exposes ��� e.g. the tools an MCP server serves, or ...Searchable, → ServiceComposesApi
sourceRepositorystringThe source-code repository this service is produced from (the SourcedFrom provenance edge). Light...Searchable, → SourcedFrom

mcpServerProperties

MCP-specific properties for Services of subtype MCP.

Only attached to Service entities where subType = MCP. Contains connection details for the MCP server.

Note: This contains only connection information (URL, transport, timeout). Authentication and Ask DataHub configuration are in GlobalSettings.aiPlugins.

FieldTypeRequiredDescriptionAnnotations
urlstringMCP server endpoint URL. Example: https://mcp.glean.com/v1Searchable
transportMcpTransportTransport protocol for MCP communication.
timeoutfloatConnection timeout in seconds. When absent, the integrations service applies its own default (cur...
customHeadersmapCustom headers to send with every request. These are non-auth headers (e.g., X-Tenant-ID, X-Clien...

serviceDefinition

The definition document for a Service ��� the full OpenAPI YAML, GraphQL SDL, gRPC .proto, or AsyncAPI document that describes everything the service exposes.

This is the source of truth for the service's interface. The operation-level api entities the service composes (the ServiceComposesApi relationship) are the parsed projection of this document.

Kept as a separate aspect (not a field on ServiceProperties) because the rawSpec blob is large and only needed on the profile ��� ServiceProperties is fetched on every search card and header, this is not.

FieldTypeRequiredDescriptionAnnotations
formatServiceDefinitionFormatThe spec format, so consumers know how to parse and render rawSpec.
rawSpecLargeStringThe entire spec document, verbatim (the source of truth). Rendered read-only on the Service profi...
versionstringSpec version, e.g. the OpenAPI info.version. Optional.
externalUrlstringLink to the canonical source of the spec, if hosted elsewhere.

incidentsSummary

Summary related incidents on an entity.

FieldTypeRequiredDescriptionAnnotations
resolvedIncidentsstring[]Resolved incidents for an asset Deprecated! Use the richer resolvedIncidentsDetails instead.⚠️ Deprecated
activeIncidentsstring[]Active incidents for an asset Deprecated! Use the richer activeIncidentsDetails instead.⚠️ Deprecated
resolvedIncidentDetailsIncidentSummaryDetails[]Summary details about the set of resolved incidentsSearchable, → ResolvedIncidents
activeIncidentDetailsIncidentSummaryDetails[]Summary details about the set of active incidentsSearchable, → ActiveIncidents

subTypes

Sub Types. Use this aspect to specialize a generic Entity e.g. Making a Dataset also be a View or also be a LookerExplore

FieldTypeRequiredDescriptionAnnotations
typeNamesstring[]The names of the specific types.Searchable

ownership

Ownership information of an entity.

FieldTypeRequiredDescriptionAnnotations
ownersOwner[]List of owners of the entity.
ownerTypesmapOwnership type to Owners map, populated via mutation hook.Searchable
lastModifiedAuditStampAudit stamp containing who last modified the record and when. A value of 0 in the time field indi...

status

The lifecycle status metadata of an entity, e.g. dataset, metric, feature, etc. This aspect is used to represent soft deletes conventionally.

FieldTypeRequiredDescriptionAnnotations
removedbooleanWhether the entity has been removed (soft-deleted). Kept for backward compatibility. When lifecyc...Searchable
lifecycleStagestringThe lifecycle stage of the entity, referencing a lifecycleStageType entity. When null, the entity...Searchable
lifecycleLastUpdatedAuditStampAttribution for the lifecycle stage transition ��� who moved the entity into its current stage an...

globalTags

Tag aspect used for applying tags to an entity

FieldTypeRequiredDescriptionAnnotations
tagsTagAssociation[]Tags associated with a given entitySearchable, → TaggedWith

semanticContent

Semantic content for enabling vector similarity search.

This aspect stores chunked text and embedding vectors for any entity that supports semantic search. Generation of the data for this aspect should be built in tight collaboration with the embedding generator during semantic search query processing. Chunk determination and generation can happen somewhat independently The data in this aspect is directly passed along to the semantic search index.

Design notes:

  • Supports multiple embedding models (e.g., different providers or versions)
  • Supports chunked content for long documents
  • Text field is optional to support privacy-sensitive use cases where only embeddings (not source text) are shared with DataHub
FieldTypeRequiredDescriptionAnnotations
embeddingsmapMap of embedding model name to embedding data. Key is the model identifier (e.g., cohere_embed_v3...

dataPlatformInstance

The specific instance of the data platform that this entity belongs to

FieldTypeRequiredDescriptionAnnotations
platformstringData PlatformSearchable
instancestringInstance of the data platform (e.g. db instance)Searchable (platformInstance)

Common Types

These types are used across multiple aspects in this entity.

AuditStamp

Data captured on a resource/association/sub-resource level giving insight into when that resource/association/sub-resource moved into a particular lifecycle stage, and who acted to move it into that specific lifecycle stage.

Fields:

  • time (long): When did the resource/association/sub-resource move into the specific lifecyc...
  • actor (string): The entity (e.g. a member URN) which will be credited for moving the resource...
  • impersonator (string?): The entity (e.g. a service URN) which performs the change on behalf of the Ac...
  • message (string?): Additional context around how DataHub was informed of the particular change. ...

IncidentSummaryDetails

Summary statistics about incidents on an entity.

Fields:

  • urn (string): The urn of the incident
  • type (string): The type of an incident
  • createdAt (long): The time at which the incident was raised in milliseconds since epoch.
  • resolvedAt (long?): The time at which the incident was marked as resolved in milliseconds since e...
  • priority (int?): The priority of the incident

Relationships

Outgoing

These are the relationships stored in this entity's aspects

  • ServiceComposesApi

    • Api via serviceProperties.apis
  • SourcedFrom

    • Repository via serviceProperties.sourceRepository
  • ResolvedIncidents

    • Incident via incidentsSummary.resolvedIncidentDetails
  • ActiveIncidents

    • Incident via incidentsSummary.activeIncidentDetails
  • OwnedBy

    • Corpuser via ownership.owners.owner
    • CorpGroup via ownership.owners.owner
  • ownershipType

    • OwnershipType via ownership.owners.typeUrn
  • TaggedWith

    • Tag via globalTags.tags

Incoming

These are the relationships stored in other entity's aspects

  • IncidentOn

    • Incident via incidentInfo.entities

Global Metadata Model

Global Graph

💡 Contributing to this documentation

This page is auto-generated from the underlying source code. To make changes, please edit the relevant source files in the metadata-models directory.

Tip: For quick typo fixes or documentation updates, you can click the ✏️ Edit icon directly in the GitHub UI to open a Pull Request. For larger changes and PR naming conventions, please refer to our Contributing Guide.