Topic Browser GraphQL API
Overview
Query Unified Namespace topics and metadata in real-time.
Endpoint:
http://localhost:8090/graphql
Default: Enabled (
graphql.enabled: true
)Authentication: None (open by default)
Schema
Queries
type Query {
topics(filter: TopicFilter, limit: Int): [Topic!]!
topic(topic: String!): Topic
}
Types
type Topic {
topic: String!
metadata: [MetadataEntry!]!
lastEvent: Event # Latest event only
}
union Event = TimeSeriesEvent | RelationalEvent
type TimeSeriesEvent {
producedAt: String!
scalarType: String!
numericValue: Float
stringValue: String
booleanValue: Boolean
}
type RelationalEvent {
producedAt: String!
json: String!
}
input TopicFilter {
text: String
meta: [MetaExpr!]
}
input MetaExpr {
key: String!
eq: String!
}
Example Queries
All topics:
{ topics { topic metadata { key value } } }
Filter by text:
{ topics(filter: { text: "temperature" }) { topic } }
Filter by metadata:
{
topics(filter: {
meta: [{ key: "data_contract", eq: "_pump" }]
}) {
topic
lastEvent {
... on TimeSeriesEvent {
producedAt
numericValue
}
}
}
}
Single topic:
{
topic(topic: "umh.v1.acme.plant1.line4.sensor1._raw.temperature") {
metadata { key value }
lastEvent {
... on TimeSeriesEvent {
producedAt
numericValue
scalarType
}
}
}
}
Using curl
Basic query:
curl -X POST http://localhost:8090/graphql \
-H "Content-Type: application/json" \
-d '{"query": "{ topics(limit: 3) { topic } }"}'
Filter query:
curl -X POST http://localhost:8090/graphql \
-H "Content-Type: application/json" \
-d '{"query": "{ topics(filter: { text: \"pump\" }) { topic lastEvent { ... on TimeSeriesEvent { numericValue } } } }"}'
Limitations
History: Latest event only (no historical data)
Subscriptions: Not supported (queries only)
Rate Limiting: None (use responsibly)
Scope: Single UMH instance only
Multi-Instance Behavior
Each UMH Core instance has its own Topic Browser
GraphQL API returns topics from local instance only
Management Console aggregates all instances into unified view
Configuration
agent:
graphql:
enabled: true # Default: true
port: 8090 # Default: 8090
debug: false # Set true for GraphiQL UI
corsOrigins: [] # Default: allows all origins
Security
Authentication: Currently open (no tokens required)
CORS: Configurable via
corsOrigins
settingNetwork Security: Recommended for production deployments
Port Access: Ensure port 8090 is appropriately secured
Last updated