Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
3dc7347
Create Grafana Plugin
YKawesome Jun 30, 2026
e45a712
Add timescale to dev docker compose
kevinthegreat1 Jun 30, 2026
c50c1cf
package-lock
YKawesome Jun 30, 2026
8b00baa
Data Source Settings
YKawesome Jun 30, 2026
a6086af
Data Source tests
YKawesome Jun 30, 2026
a2a7999
Add query dropdowns per spec + tests
YKawesome Jun 30, 2026
1771586
Add database connection and check health
kevinthegreat1 Jun 30, 2026
84f937c
Add valueType
YKawesome Jun 30, 2026
4c87691
Revert "Add valueType"
YKawesome Jun 30, 2026
5b65405
Key dropdown appears conditionally
YKawesome Jun 30, 2026
f3e12e9
Add resources and dropdown support to backend
kevinthegreat1 Jun 30, 2026
9caac14
Telemetry/Event Frontend Swapping
YKawesome Jun 30, 2026
31e05b2
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
YKawesome Jun 30, 2026
bbccca5
Move query to separate file
kevinthegreat1 Jun 30, 2026
4c55f1d
Update endpoints + event stubs
YKawesome Jun 30, 2026
bceb56c
UX: Add placeholder to select component before channel/event name
YKawesome Jun 30, 2026
8f5f067
Added GETs for events
YKawesome Jun 30, 2026
312bb5f
Severity text
YKawesome Jun 30, 2026
05decb1
Updated tests
YKawesome Jun 30, 2026
b1f47c8
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
kevinthegreat1 Jun 30, 2026
3f60718
Add telemetry query backend
kevinthegreat1 Jun 30, 2026
5a33fa8
Rename telemetry gets
kevinthegreat1 Jun 30, 2026
49e523b
Changing component resets channel/event name
YKawesome Jun 30, 2026
07674d1
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
YKawesome Jun 30, 2026
6ffcce1
Changing component resets graph
YKawesome Jun 30, 2026
53aa557
Add query events stub
kevinthegreat1 Jun 30, 2026
70447b8
Make events plural
kevinthegreat1 Jun 30, 2026
bc8cb00
Add query events backend
kevinthegreat1 Jun 30, 2026
f1cc7cf
Remove Event Fields + Source column on choice
YKawesome Jul 1, 2026
01685c9
Time Override UI + Spacing
YKawesome Jul 1, 2026
19a8b43
Always return event source
kevinthegreat1 Jul 1, 2026
785fba9
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
kevinthegreat1 Jul 1, 2026
5799a03
Add time range override
kevinthegreat1 Jul 1, 2026
71c7de9
Make time range override optional
kevinthegreat1 Jul 1, 2026
ea2cd55
Default to telemetry on frontend
YKawesome Jul 1, 2026
aa4e9e7
Synced Manual Time Override
YKawesome Jul 1, 2026
428a4de
Use native grafana time picker ui
YKawesome Jul 1, 2026
e521639
Move grafana workflows into main dir
kevinthegreat1 Jul 1, 2026
e04c6f9
Remove unecessary hooks
YKawesome Jul 1, 2026
673a78b
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
YKawesome Jul 1, 2026
acef6f7
Use InlineFieldRow
YKawesome Jul 1, 2026
b83bd05
Hide source when selected (frontend)
YKawesome Jul 1, 2026
8c49e17
Update workflows to correct sub directory
kevinthegreat1 Jul 1, 2026
f5a9b1e
Rename workflows
kevinthegreat1 Jul 1, 2026
ba5f2db
Fix lint
kevinthegreat1 Jul 1, 2026
cf0f322
Fix empty resource call parameters
kevinthegreat1 Jul 1, 2026
0598204
Fix backend lint
kevinthegreat1 Jul 1, 2026
df19342
Fix mage work dir
kevinthegreat1 Jul 1, 2026
9b68f7f
Fix check plugin dir
kevinthegreat1 Jul 1, 2026
1cc54c5
Resolve e2e plugin directory is not available yet
kevinthegreat1 Jul 1, 2026
e1b709f
Migrate telemtry to 1 query
kevinthegreat1 Jul 2, 2026
6b143a5
Merge branch 'main' into 70-build-custom-grafana-datasource-plugin-fo…
YKawesome Jul 2, 2026
309b55d
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
YKawesome Jul 2, 2026
cf18ed6
Add tests + sqlmock
YKawesome Jul 2, 2026
1d77064
Remove ERT selector (default inclusion)
YKawesome Jul 2, 2026
d262a58
Add support for multi key queries
kevinthegreat1 Jul 2, 2026
eb9f128
Add TIME/ERT Picker to Frontend
YKawesome Jul 2, 2026
9dfb320
Minor UI
YKawesome Jul 2, 2026
475dfe1
Fix tests (ignore db close value)
YKawesome Jul 2, 2026
8446cb6
defaultquery includes time
YKawesome Jul 2, 2026
f8519c7
Add time field support
kevinthegreat1 Jul 2, 2026
1adc8ac
Update tests (add key, timefield)
YKawesome Jul 2, 2026
7a0add7
Auto select if only one channel
kevinthegreat1 Jul 2, 2026
dbbf41d
Fix lint
kevinthegreat1 Jul 2, 2026
7c44c67
Fix empty time type
kevinthegreat1 Jul 2, 2026
977841d
Add support for multi components, channels, sources, and keys
kevinthegreat1 Jul 6, 2026
2d6b3f8
Add source to frame id
kevinthegreat1 Jul 6, 2026
d667690
Fix duplicate channel error + Tests
YKawesome Jul 6, 2026
922b7d3
UI: Remove visual ambiguity due to cut off text
YKawesome Jul 6, 2026
2402f38
UI: Removed redundant frame name/value name
YKawesome Jul 6, 2026
d02b664
Update e2e tests
YKawesome Jul 6, 2026
92882b5
Add inital grafana README
YKawesome Jul 6, 2026
2fc05bc
Update go mod + cleanup interface{}
YKawesome Jul 6, 2026
0c8d9f6
Add checks + helper + save config in Datasource + close db
YKawesome Jul 6, 2026
7e16719
Frontend refactoring + cleanup
YKawesome Jul 6, 2026
e290a55
Add dev README to repo root
YKawesome Jul 6, 2026
fc13345
Fix TS Error: T[] forbidden for non-simple types
YKawesome Jul 6, 2026
6f73f07
Fix CI
YKawesome Jul 6, 2026
5030a67
Add grafana timescale hermes integration test
kevinthegreat1 Jul 6, 2026
19724c8
Fix CI
YKawesome Jul 6, 2026
da5946c
Add path to binary for CI
YKawesome Jul 6, 2026
225d1fd
Compatibility with 12.3.8
YKawesome Jul 6, 2026
f5db457
Add emit telemetry and event
kevinthegreat1 Jul 7, 2026
50ec7aa
Fix emitting events and telemetry
kevinthegreat1 Jul 7, 2026
05b1bde
Add query benchmark
kevinthegreat1 Jul 7, 2026
c2ee59c
Add 1 hour test
kevinthegreat1 Jul 7, 2026
9696112
Migrate emit data to grpc streams
kevinthegreat1 Jul 7, 2026
6f3d6c4
Reuse db connection
kevinthegreat1 Jul 7, 2026
c694948
Use compiled backend
kevinthegreat1 Jul 7, 2026
7e9bd70
Remove unnecessary reset timer
kevinthegreat1 Jul 7, 2026
cc14d6d
Merge branch '70-build-custom-grafana-datasource-plugin-for-timescale…
kevinthegreat1 Jul 7, 2026
36911a5
Fix lint
kevinthegreat1 Jul 7, 2026
724d0a2
Ping db instead of wait
kevinthegreat1 Jul 8, 2026
041d784
Merge branch 'main' into test-grafana-plugin-queries
kevinthegreat1 Jul 14, 2026
8f5cfc1
Fix benchmark query
kevinthegreat1 Jul 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
172 changes: 172 additions & 0 deletions cmd/backend/hermes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
[
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "127.0.0.1",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
},
{
"name": "TimescaleDB",
"provider": "TimescaleDB",
"settings": {
"host": "localhost",
"user": "postgres",
"password": "password",
"database": "hermes"
}
}
]
88 changes: 88 additions & 0 deletions lib/python/hermes_pb2_grpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,11 +176,21 @@ def __init__(self, channel):
request_serializer=bus__pb2.BusFilter.SerializeToString,
response_deserializer=bus__pb2.SourcedEvent.FromString,
_registered_method=True)
self.EmitEvent = channel.stream_unary(
'/Api/EmitEvent',
request_serializer=bus__pb2.SourcedEvent.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
_registered_method=True)
self.SubTelemetry = channel.unary_stream(
'/Api/SubTelemetry',
request_serializer=bus__pb2.BusFilter.SerializeToString,
response_deserializer=bus__pb2.SourcedTelemetry.FromString,
_registered_method=True)
self.EmitTelemetry = channel.stream_unary(
'/Api/EmitTelemetry',
request_serializer=bus__pb2.SourcedTelemetry.SerializeToString,
response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
_registered_method=True)
self.SubFileDownlink = channel.unary_stream(
'/Api/SubFileDownlink',
request_serializer=bus__pb2.BusFilter.SerializeToString,
Expand Down Expand Up @@ -452,13 +462,27 @@ def SubEvent(self, request, context):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def EmitEvent(self, request_iterator, context):
"""Emit to the event message bus
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def SubTelemetry(self, request, context):
"""Subscribe to the telemetry message bus
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def EmitTelemetry(self, request_iterator, context):
"""Emit to the telemetry message bus
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')

def SubFileDownlink(self, request, context):
"""Subscribe to the file downlink message bus
"""
Expand Down Expand Up @@ -618,11 +642,21 @@ def add_ApiServicer_to_server(servicer, server):
request_deserializer=bus__pb2.BusFilter.FromString,
response_serializer=bus__pb2.SourcedEvent.SerializeToString,
),
'EmitEvent': grpc.stream_unary_rpc_method_handler(
servicer.EmitEvent,
request_deserializer=bus__pb2.SourcedEvent.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'SubTelemetry': grpc.unary_stream_rpc_method_handler(
servicer.SubTelemetry,
request_deserializer=bus__pb2.BusFilter.FromString,
response_serializer=bus__pb2.SourcedTelemetry.SerializeToString,
),
'EmitTelemetry': grpc.stream_unary_rpc_method_handler(
servicer.EmitTelemetry,
request_deserializer=bus__pb2.SourcedTelemetry.FromString,
response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
),
'SubFileDownlink': grpc.unary_stream_rpc_method_handler(
servicer.SubFileDownlink,
request_deserializer=bus__pb2.BusFilter.FromString,
Expand Down Expand Up @@ -1379,6 +1413,33 @@ def SubEvent(request,
metadata,
_registered_method=True)

@staticmethod
def EmitEvent(request_iterator,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.stream_unary(
request_iterator,
target,
'/Api/EmitEvent',
bus__pb2.SourcedEvent.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def SubTelemetry(request,
target,
Expand Down Expand Up @@ -1406,6 +1467,33 @@ def SubTelemetry(request,
metadata,
_registered_method=True)

@staticmethod
def EmitTelemetry(request_iterator,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.stream_unary(
request_iterator,
target,
'/Api/EmitTelemetry',
bus__pb2.SourcedTelemetry.SerializeToString,
google_dot_protobuf_dot_empty__pb2.Empty.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

@staticmethod
def SubFileDownlink(request,
target,
Expand Down
8 changes: 6 additions & 2 deletions nasa-hermes-datasource/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ require (
github.com/DATA-DOG/go-sqlmock v1.5.2
github.com/grafana/grafana-plugin-sdk-go v0.292.2
github.com/lib/pq v1.12.3
github.com/nasa/hermes v0.0.0
google.golang.org/grpc v1.81.1
google.golang.org/protobuf v1.36.11
)

require (
Expand Down Expand Up @@ -76,6 +79,7 @@ require (
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.44.0 // indirect
go.opentelemetry.io/otel/metric v1.44.0 // indirect
go.opentelemetry.io/otel/sdk v1.44.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.44.0 // indirect
go.opentelemetry.io/otel/trace v1.44.0 // indirect
go.opentelemetry.io/proto/otlp v1.10.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
Expand All @@ -84,7 +88,7 @@ require (
golang.org/x/sys v0.45.0 // indirect
golang.org/x/text v0.37.0 // indirect
google.golang.org/genproto v0.0.0-20210630183607-d20f26d13c79 // indirect
google.golang.org/grpc v1.81.1 // indirect
google.golang.org/protobuf v1.36.11 // indirect
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
)

replace github.com/nasa/hermes => ../
Loading
Loading