mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
53 lines
1.7 KiB
Go
53 lines
1.7 KiB
Go
package live
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/grafana/grafana-live-sdk/telemetry/telegraf"
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
"github.com/grafana/grafana/pkg/models"
|
|
)
|
|
|
|
type Demultiplexer struct {
|
|
streamID string
|
|
managedStreamRunner *ManagedStreamRunner
|
|
telegrafConverterWide *telegraf.Converter
|
|
}
|
|
|
|
func NewDemultiplexer(streamID string, managedStreamRunner *ManagedStreamRunner) *Demultiplexer {
|
|
return &Demultiplexer{
|
|
streamID: streamID,
|
|
managedStreamRunner: managedStreamRunner,
|
|
telegrafConverterWide: telegraf.NewConverter(),
|
|
}
|
|
}
|
|
|
|
func (s *Demultiplexer) GetHandlerForPath(_ string) (models.ChannelHandler, error) {
|
|
return s, nil
|
|
}
|
|
|
|
func (s *Demultiplexer) OnSubscribe(_ context.Context, _ *models.SignedInUser, _ models.SubscribeEvent) (models.SubscribeReply, backend.SubscribeStreamStatus, error) {
|
|
return models.SubscribeReply{}, backend.SubscribeStreamStatusPermissionDenied, nil
|
|
}
|
|
|
|
func (s *Demultiplexer) OnPublish(_ context.Context, _ *models.SignedInUser, evt models.PublishEvent) (models.PublishReply, backend.PublishStreamStatus, error) {
|
|
stream, err := s.managedStreamRunner.GetOrCreateStream(s.streamID)
|
|
if err != nil {
|
|
logger.Error("Error getting stream", "error", err, "streamId", s.streamID)
|
|
return models.PublishReply{}, 0, err
|
|
}
|
|
metricFrames, err := s.telegrafConverterWide.Convert(evt.Data)
|
|
if err != nil {
|
|
logger.Error("Error converting metrics", "error", err, "data", string(evt.Data))
|
|
return models.PublishReply{}, 0, err
|
|
}
|
|
for _, mf := range metricFrames {
|
|
err := stream.Push(mf.Key(), mf.Frame())
|
|
if err != nil {
|
|
return models.PublishReply{}, 0, err
|
|
}
|
|
}
|
|
return models.PublishReply{}, backend.PublishStreamStatusOK, nil
|
|
}
|