pkg/exporter/probe/proto.go (127 lines of code) (raw):
package probe
import (
"context"
"errors"
"sync"
"github.com/prometheus/client_golang/prometheus"
)
var (
ErrProbeNotExists = errors.New("probe not exists")
ErrProbeAlreadyExists = errors.New("probe already exists")
ErrInvalidProbeState = errors.New("invalid probe state")
)
type Type uint8
type EventType string
const (
ProbeTypeMetrics = iota
ProbeTypeEvent
ProbeTypeCount
)
func (p Type) String() string {
switch p {
case ProbeTypeMetrics:
return "metrics"
case ProbeTypeEvent:
return "event"
default:
return ""
}
}
type State uint8
const (
ProbeStateStopped = iota
ProbeStateStarting
ProbeStateRunning
ProbeStateStopping
ProbeStateFailed
)
func (ps State) String() string {
switch ps {
case ProbeStateStopped:
return "Stopped"
case ProbeStateRunning:
return "Running"
case ProbeStateStarting:
return "Starting"
case ProbeStateStopping:
return "Stopping"
}
return ""
}
type RawEvent struct {
Netns uint32
EventType string
EventBody string
}
type Label struct {
Name string `json:"name"`
Value string `json:"value"`
}
type Event struct {
Timestamp int64 `json:"timestamp"`
Type EventType `json:"type"`
Labels []Label `json:"labels"`
Message string `json:"msg"`
}
type Probe interface {
Start(ctx context.Context) error
Stop(ctx context.Context) error
State() State
Name() string
}
type MetricsProbe interface {
Probe
prometheus.Collector
}
type EventProbe interface {
Probe
}
type SimpleProbe interface {
Start(ctx context.Context) error
Stop(ctx context.Context) error
}
type simpleProbe struct {
name string
state State
inner SimpleProbe
lock sync.Mutex
}
func (s *simpleProbe) Start(ctx context.Context) error {
if s.state != ProbeStateStopped {
return ErrInvalidProbeState
}
s.lock.Lock()
defer s.lock.Unlock()
s.state = ProbeStateStarting
if err := s.inner.Start(ctx); err != nil {
s.state = ProbeStateFailed
return err
}
s.state = ProbeStateRunning
return nil
}
func (s *simpleProbe) Stop(ctx context.Context) error {
if s.state != ProbeStateRunning {
return ErrInvalidProbeState
}
s.lock.Lock()
defer s.lock.Unlock()
if err := s.inner.Stop(ctx); err != nil {
s.state = ProbeStateFailed
return err
}
s.state = ProbeStateStopped
return nil
}
func (s *simpleProbe) State() State {
return s.state
}
func (s *simpleProbe) Name() string {
return s.name
}
func NewProbe(name string, probe SimpleProbe) Probe {
return &simpleProbe{
name: name,
inner: probe,
}
}