metrics

package
v0.1.0-beta Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 6, 2017 License: MIT Imports: 6 Imported by: 49

Documentation

Index

Constants

View Source
const (
	Common = iota
	Frontend
	History
	Matching
	NumServices
)

Service names for all services that emit metrics.

View Source
const (
	HostnameTagName  = "hostname"
	OperationTagName = "operation"
	ShardTagName     = "shard"
)

Common tags for all services

View Source
const (
	RestartCount         = "restarts"
	NumGoRoutinesGauge   = "num-goroutines"
	GoMaxProcsGauge      = "gomaxprocs"
	MemoryAllocatedGauge = "memory.allocated"
	MemoryHeapGauge      = "memory.heap"
	MemoryHeapIdleGauge  = "memory.heapidle"
	MemoryHeapInuseGauge = "memory.heapinuse"
	MemoryStackGauge     = "memory.stack"
	NumGCCounter         = "memory.num-gc"
	GcPauseMsTimer       = "memory.gc-pause-ms"
)

Common service base metrics

View Source
const (

	// PersistenceCreateShardScope tracks CreateShard calls made by service to persistence layer
	PersistenceCreateShardScope = iota
	// PersistenceGetShardScope tracks GetShard calls made by service to persistence layer
	PersistenceGetShardScope
	// PersistenceUpdateShardScope tracks UpdateShard calls made by service to persistence layer
	PersistenceUpdateShardScope
	// PersistenceCreateWorkflowExecutionScope tracks CreateWorkflowExecution calls made by service to persistence layer
	PersistenceCreateWorkflowExecutionScope
	// PersistenceGetWorkflowExecutionScope tracks GetWorkflowExecution calls made by service to persistence layer
	PersistenceGetWorkflowExecutionScope
	// PersistenceUpdateWorkflowExecutionScope tracks UpdateWorkflowExecution calls made by service to persistence layer
	PersistenceUpdateWorkflowExecutionScope
	// PersistenceDeleteWorkflowExecutionScope tracks DeleteWorkflowExecution calls made by service to persistence layer
	PersistenceDeleteWorkflowExecutionScope
	// PersistenceGetCurrentExecutionScope tracks GetCurrentExecution calls made by service to persistence layer
	PersistenceGetCurrentExecutionScope
	// PersistenceGetTransferTasksScope tracks GetTransferTasks calls made by service to persistence layer
	PersistenceGetTransferTasksScope
	// PersistenceCompleteTransferTaskScope tracks CompleteTransferTasks calls made by service to persistence layer
	PersistenceCompleteTransferTaskScope
	// PersistenceGetTimerIndexTasksScope tracks GetTimerIndexTasks calls made by service to persistence layer
	PersistenceGetTimerIndexTasksScope
	// PersistenceCompleteTimerTaskScope tracks CompleteTimerTasks calls made by service to persistence layer
	PersistenceCompleteTimerTaskScope
	// PersistenceCreateTaskScope tracks CreateTask calls made by service to persistence layer
	PersistenceCreateTaskScope
	// PersistenceGetTasksScope tracks GetTasks calls made by service to persistence layer
	PersistenceGetTasksScope
	// PersistenceCompleteTaskScope tracks CompleteTask calls made by service to persistence layer
	PersistenceCompleteTaskScope
	// PersistenceLeaseTaskListScope tracks LeaseTaskList calls made by service to persistence layer
	PersistenceLeaseTaskListScope
	// PersistenceUpdateTaskListScope tracks PersistenceUpdateTaskListScope calls made by service to persistence layer
	PersistenceUpdateTaskListScope
	// PersistenceAppendHistoryEventsScope tracks AppendHistoryEvents calls made by service to persistence layer
	PersistenceAppendHistoryEventsScope
	// PersistenceGetWorkflowExecutionHistoryScope tracks GetWorkflowExecutionHistory calls made by service to persistence layer
	PersistenceGetWorkflowExecutionHistoryScope
	// PersistenceDeleteWorkflowExecutionHistoryScope tracks DeleteWorkflowExecutionHistory calls made by service to persistence layer
	PersistenceDeleteWorkflowExecutionHistoryScope
	// PersistenceCreateDomainScope tracks CreateDomain calls made by service to persistence layer
	PersistenceCreateDomainScope
	// PersistenceGetDomainScope tracks GetDomain calls made by service to persistence layer
	PersistenceGetDomainScope
	// PersistenceUpdateDomainScope tracks UpdateDomain calls made by service to persistence layer
	PersistenceUpdateDomainScope
	// PersistenceDeleteDomainScope tracks DeleteDomain calls made by service to persistence layer
	PersistenceDeleteDomainScope
	// PersistenceDeleteDomainByNameScope tracks DeleteDomainByName calls made by service to persistence layer
	PersistenceDeleteDomainByNameScope
	// HistoryClientStartWorkflowExecutionScope tracks RPC calls to history service
	HistoryClientStartWorkflowExecutionScope
	// HistoryClientRecordActivityTaskHeartbeatScope tracks RPC calls to history service
	HistoryClientRecordActivityTaskHeartbeatScope
	// HistoryClientRespondDecisionTaskCompletedScope tracks RPC calls to history service
	HistoryClientRespondDecisionTaskCompletedScope
	// HistoryClientRespondActivityTaskCompletedScope tracks RPC calls to history service
	HistoryClientRespondActivityTaskCompletedScope
	// HistoryClientRespondActivityTaskFailedScope tracks RPC calls to history service
	HistoryClientRespondActivityTaskFailedScope
	// HistoryClientRespondActivityTaskCanceledScope tracks RPC calls to history service
	HistoryClientRespondActivityTaskCanceledScope
	// HistoryClientGetWorkflowExecutionNextEventIDScope tracks RPC calls to history service
	HistoryClientGetWorkflowExecutionNextEventIDScope
	// HistoryClientRecordDecisionTaskStartedScope tracks RPC calls to history service
	HistoryClientRecordDecisionTaskStartedScope
	// HistoryClientRecordActivityTaskStartedScope tracks RPC calls to history service
	HistoryClientRecordActivityTaskStartedScope
	// HistoryClientRequestCancelWorkflowExecutionScope tracks RPC calls to history service
	HistoryClientRequestCancelWorkflowExecutionScope
	// HistoryClientSignalWorkflowExecutionScope tracks RPC calls to history service
	HistoryClientSignalWorkflowExecutionScope
	// HistoryClientTerminateWorkflowExecutionScope tracks RPC calls to history service
	HistoryClientTerminateWorkflowExecutionScope
	// HistoryClientScheduleDecisionTaskScope tracks RPC calls to history service
	HistoryClientScheduleDecisionTaskScope
	// HistoryClientRecordChildExecutionCompletedScope tracks RPC calls to history service
	HistoryClientRecordChildExecutionCompletedScope
	// MatchingClientPollForDecisionTaskScope tracks RPC calls to matching service
	MatchingClientPollForDecisionTaskScope
	// MatchingClientPollForActivityTaskScope tracks RPC calls to matching service
	MatchingClientPollForActivityTaskScope
	// MatchingClientAddActivityTaskScope tracks RPC calls to matching service
	MatchingClientAddActivityTaskScope
	// MatchingClientAddDecisionTaskScope tracks RPC calls to matching service
	MatchingClientAddDecisionTaskScope

	NumCommonScopes
)

Scopes enum

View Source
const (
	// StartWorkflowExecutionScope tracks StartWorkflowExecution API calls received by service
	StartWorkflowExecutionScope = iota + NumCommonScopes
	// PollForDecisionTaskScope tracks PollForDecisionTask API calls received by service
	PollForDecisionTaskScope
	// PollForActivityTaskScope tracks PollForActivityTask API calls received by service
	PollForActivityTaskScope
	// RecordActivityTaskHeartbeatScope tracks RecordActivityTaskHeartbeat API calls received by service
	RecordActivityTaskHeartbeatScope
	// RespondDecisionTaskCompletedScope tracks RespondDecisionTaskCompleted API calls received by service
	RespondDecisionTaskCompletedScope
	// RespondActivityTaskCompletedScope tracks RespondActivityTaskCompleted API calls received by service
	RespondActivityTaskCompletedScope
	// RespondActivityTaskFailedScope tracks RespondActivityTaskFailed API calls received by service
	RespondActivityTaskFailedScope
	// GetWorkflowExecutionHistoryScope tracks GetWorkflowExecutionHistory API calls received by service
	GetWorkflowExecutionHistoryScope

	NumFrontendScopes
)

-- Operation scopes for Frontend service --

View Source
const (
	// HistoryStartWorkflowExecutionScope tracks StartWorkflowExecution API calls received by service
	HistoryStartWorkflowExecutionScope = iota + NumCommonScopes
	// HistoryRecordActivityTaskHeartbeatScope tracks RecordActivityTaskHeartbeat API calls received by service
	HistoryRecordActivityTaskHeartbeatScope
	// HistoryRespondDecisionTaskCompletedScope tracks RespondDecisionTaskCompleted API calls received by service
	HistoryRespondDecisionTaskCompletedScope
	// HistoryRespondActivityTaskCompletedScope tracks RespondActivityTaskCompleted API calls received by service
	HistoryRespondActivityTaskCompletedScope
	// HistoryRespondActivityTaskFailedScope tracks RespondActivityTaskFailed API calls received by service
	HistoryRespondActivityTaskFailedScope
	// HistoryRespondActivityTaskCanceledScope tracks RespondActivityTaskCanceled API calls received by service
	HistoryRespondActivityTaskCanceledScope
	// HistoryGetWorkflowExecutionNextEventIDScope tracks GetWorkflowExecutionHistory API calls received by service
	HistoryGetWorkflowExecutionNextEventIDScope
	// HistoryRecordDecisionTaskStartedScope tracks RecordDecisionTaskStarted API calls received by service
	HistoryRecordDecisionTaskStartedScope
	// HistoryRecordActivityTaskStartedScope tracks RecordActivityTaskStarted API calls received by service
	HistoryRecordActivityTaskStartedScope
	// HistorySignalWorkflowExecutionScope tracks SignalWorkflowExecution API calls received by service
	HistorySignalWorkflowExecutionScope
	// HistoryTerminateWorkflowExecutionScope tracks TerminateWorkflowExecution API calls received by service
	HistoryTerminateWorkflowExecutionScope
	// HistoryScheduleDecisionTaskScope tracks ScheduleDecisionTask API calls received by service
	HistoryScheduleDecisionTaskScope
	// HistoryRecordChildExecutionCompletedScope tracks CompleteChildExecution API calls received by service
	HistoryRecordChildExecutionCompletedScope
	// HistoryProcessTransferTasksScope tracks number of transfer tasks processed
	HistoryProcessTransferTasksScope
	// HistoryRequestCancelWorkflowExecutionScope tracks RequestCancelWorkflowExecution API calls received by service
	HistoryRequestCancelWorkflowExecutionScope
	// HistoryMultipleCompletionDecisionsScope tracks number of duplicate completion decisions for an execution
	HistoryMultipleCompletionDecisionsScope

	NumHistoryScopes
)

-- Operation scopes for History service --

View Source
const (
	// PollForDecisionTaskScope tracks PollForDecisionTask API calls received by service
	MatchingPollForDecisionTaskScope = iota + NumCommonScopes
	// PollForActivityTaskScope tracks PollForActivityTask API calls received by service
	MatchingPollForActivityTaskScope
	// MatchingAddActivityTaskScope tracks AddActivityTask API calls received by service
	MatchingAddActivityTaskScope
	// MatchingAddDecisionTaskScope tracks AddDecisionTask API calls received by service
	MatchingAddDecisionTaskScope

	NumMatchingScopes
)

-- Operation scopes for Matching service --

View Source
const (
	CadenceRequests = iota
	CadenceFailures
	CadenceLatency
	CadenceErrBadRequestCounter
	CadenceErrEntityNotExistsCounter
	CadenceErrExecutionAlreadyStartedCounter
	CadenceErrDomainAlreadyExistsCounter
	PersistenceRequests
	PersistenceFailures
	PersistenceLatency
	PersistenceErrShardExistsCounter
	PersistenceErrShardOwnershipLostCounter
	PersistenceErrConditionFailedCounter
	PersistenceErrTimeoutCounter

	NumCommonMetrics
)

Common Metrics enum

View Source
const (
	TransferTasksProcessedCounter = iota + NumCommonMetrics
	MultipleCompletionDecisionsCounter
	FailedDecisionsCounter
	CadenceErrEventAlreadyStartedCounter
	CadenceErrShardOwnershipLostCounter
)

History Metrics enum

View Source
const (
	// NoError indicates that there is no error (error should be nil)
	NoError = ErrorClass(iota)
	// UserError indicates that this is NOT an SLA-reportable error
	UserError
	// InternalError indicates that this is an SLA-reportable error
	InternalError
)
View Source
const (
	UnknownDirectoryTagValue = "Unknown"
)

This package should hold all the metrics and tags for cadence

Variables

GoRuntimeMetrics represent the runtime stats from go runtime

View Source
var MetricDefs = map[ServiceIdx]map[int]metricDefinition{
	Common: {
		CadenceRequests:                          {/* contains filtered or unexported fields */},
		CadenceFailures:                          {/* contains filtered or unexported fields */},
		CadenceLatency:                           {/* contains filtered or unexported fields */},
		CadenceErrBadRequestCounter:              {/* contains filtered or unexported fields */},
		CadenceErrEntityNotExistsCounter:         {/* contains filtered or unexported fields */},
		CadenceErrExecutionAlreadyStartedCounter: {/* contains filtered or unexported fields */},
		CadenceErrDomainAlreadyExistsCounter:     {/* contains filtered or unexported fields */},
		PersistenceRequests:                      {/* contains filtered or unexported fields */},
		PersistenceFailures:                      {/* contains filtered or unexported fields */},
		PersistenceLatency:                       {/* contains filtered or unexported fields */},
		PersistenceErrShardExistsCounter:         {/* contains filtered or unexported fields */},
		PersistenceErrShardOwnershipLostCounter:  {/* contains filtered or unexported fields */},
		PersistenceErrConditionFailedCounter:     {/* contains filtered or unexported fields */},
		PersistenceErrTimeoutCounter:             {/* contains filtered or unexported fields */},
	},
	Frontend: {},
	History: {
		TransferTasksProcessedCounter:        {/* contains filtered or unexported fields */},
		MultipleCompletionDecisionsCounter:   {/* contains filtered or unexported fields */},
		FailedDecisionsCounter:               {/* contains filtered or unexported fields */},
		CadenceErrShardOwnershipLostCounter:  {/* contains filtered or unexported fields */},
		CadenceErrEventAlreadyStartedCounter: {/* contains filtered or unexported fields */},
	},
	Matching: {},
}

MetricDefs record the metrics for all services

View Source
var ScopeDefs = map[ServiceIdx]map[int]scopeDefinition{

	Common: {
		PersistenceCreateShardScope:                    {/* contains filtered or unexported fields */},
		PersistenceGetShardScope:                       {/* contains filtered or unexported fields */},
		PersistenceUpdateShardScope:                    {/* contains filtered or unexported fields */},
		PersistenceCreateWorkflowExecutionScope:        {/* contains filtered or unexported fields */},
		PersistenceGetWorkflowExecutionScope:           {/* contains filtered or unexported fields */},
		PersistenceUpdateWorkflowExecutionScope:        {/* contains filtered or unexported fields */},
		PersistenceDeleteWorkflowExecutionScope:        {/* contains filtered or unexported fields */},
		PersistenceGetCurrentExecutionScope:            {/* contains filtered or unexported fields */},
		PersistenceGetTransferTasksScope:               {/* contains filtered or unexported fields */},
		PersistenceCompleteTransferTaskScope:           {/* contains filtered or unexported fields */},
		PersistenceGetTimerIndexTasksScope:             {/* contains filtered or unexported fields */},
		PersistenceCompleteTimerTaskScope:              {/* contains filtered or unexported fields */},
		PersistenceCreateTaskScope:                     {/* contains filtered or unexported fields */},
		PersistenceGetTasksScope:                       {/* contains filtered or unexported fields */},
		PersistenceCompleteTaskScope:                   {/* contains filtered or unexported fields */},
		PersistenceLeaseTaskListScope:                  {/* contains filtered or unexported fields */},
		PersistenceUpdateTaskListScope:                 {/* contains filtered or unexported fields */},
		PersistenceAppendHistoryEventsScope:            {/* contains filtered or unexported fields */},
		PersistenceGetWorkflowExecutionHistoryScope:    {/* contains filtered or unexported fields */},
		PersistenceDeleteWorkflowExecutionHistoryScope: {/* contains filtered or unexported fields */},
		PersistenceCreateDomainScope:                   {/* contains filtered or unexported fields */},
		PersistenceGetDomainScope:                      {/* contains filtered or unexported fields */},
		PersistenceUpdateDomainScope:                   {/* contains filtered or unexported fields */},
		PersistenceDeleteDomainScope:                   {/* contains filtered or unexported fields */},
		PersistenceDeleteDomainByNameScope:             {/* contains filtered or unexported fields */},

		HistoryClientStartWorkflowExecutionScope:          {/* contains filtered or unexported fields */},
		HistoryClientRecordActivityTaskHeartbeatScope:     {/* contains filtered or unexported fields */},
		HistoryClientRespondDecisionTaskCompletedScope:    {/* contains filtered or unexported fields */},
		HistoryClientRespondActivityTaskCompletedScope:    {/* contains filtered or unexported fields */},
		HistoryClientRespondActivityTaskFailedScope:       {/* contains filtered or unexported fields */},
		HistoryClientRespondActivityTaskCanceledScope:     {/* contains filtered or unexported fields */},
		HistoryClientGetWorkflowExecutionNextEventIDScope: {/* contains filtered or unexported fields */},
		HistoryClientRecordDecisionTaskStartedScope:       {/* contains filtered or unexported fields */},
		HistoryClientRecordActivityTaskStartedScope:       {/* contains filtered or unexported fields */},
		HistoryClientRequestCancelWorkflowExecutionScope:  {/* contains filtered or unexported fields */},
		HistoryClientSignalWorkflowExecutionScope:         {/* contains filtered or unexported fields */},
		HistoryClientTerminateWorkflowExecutionScope:      {/* contains filtered or unexported fields */},
		HistoryClientScheduleDecisionTaskScope:            {/* contains filtered or unexported fields */},
		HistoryClientRecordChildExecutionCompletedScope:   {/* contains filtered or unexported fields */},
		MatchingClientPollForDecisionTaskScope:            {/* contains filtered or unexported fields */},
		MatchingClientPollForActivityTaskScope:            {/* contains filtered or unexported fields */},
		MatchingClientAddActivityTaskScope:                {/* contains filtered or unexported fields */},
		MatchingClientAddDecisionTaskScope:                {/* contains filtered or unexported fields */},
	},

	Frontend: {
		StartWorkflowExecutionScope:       {/* contains filtered or unexported fields */},
		PollForDecisionTaskScope:          {/* contains filtered or unexported fields */},
		PollForActivityTaskScope:          {/* contains filtered or unexported fields */},
		RecordActivityTaskHeartbeatScope:  {/* contains filtered or unexported fields */},
		RespondDecisionTaskCompletedScope: {/* contains filtered or unexported fields */},
		RespondActivityTaskCompletedScope: {/* contains filtered or unexported fields */},
		RespondActivityTaskFailedScope:    {/* contains filtered or unexported fields */},
		GetWorkflowExecutionHistoryScope:  {/* contains filtered or unexported fields */},
	},

	History: {
		HistoryStartWorkflowExecutionScope:          {/* contains filtered or unexported fields */},
		HistoryRecordActivityTaskHeartbeatScope:     {/* contains filtered or unexported fields */},
		HistoryRespondDecisionTaskCompletedScope:    {/* contains filtered or unexported fields */},
		HistoryRespondActivityTaskCompletedScope:    {/* contains filtered or unexported fields */},
		HistoryRespondActivityTaskFailedScope:       {/* contains filtered or unexported fields */},
		HistoryRespondActivityTaskCanceledScope:     {/* contains filtered or unexported fields */},
		HistoryGetWorkflowExecutionNextEventIDScope: {/* contains filtered or unexported fields */},
		HistoryRecordDecisionTaskStartedScope:       {/* contains filtered or unexported fields */},
		HistoryRecordActivityTaskStartedScope:       {/* contains filtered or unexported fields */},
		HistorySignalWorkflowExecutionScope:         {/* contains filtered or unexported fields */},
		HistoryTerminateWorkflowExecutionScope:      {/* contains filtered or unexported fields */},
		HistoryScheduleDecisionTaskScope:            {/* contains filtered or unexported fields */},
		HistoryRecordChildExecutionCompletedScope:   {/* contains filtered or unexported fields */},
		HistoryProcessTransferTasksScope:            {/* contains filtered or unexported fields */},
		HistoryRequestCancelWorkflowExecutionScope:  {/* contains filtered or unexported fields */},
		HistoryMultipleCompletionDecisionsScope:     {/* contains filtered or unexported fields */},
	},

	Matching: {
		MatchingPollForDecisionTaskScope: {/* contains filtered or unexported fields */},
		MatchingPollForActivityTaskScope: {/* contains filtered or unexported fields */},
		MatchingAddActivityTaskScope:     {/* contains filtered or unexported fields */},
		MatchingAddDecisionTaskScope:     {/* contains filtered or unexported fields */},
	},
}

ScopeDefs record the scopes for all services

View Source
var ServiceMetrics = map[MetricName]MetricType{
	RestartCount: Counter,
}

ServiceMetrics are types for common service base metrics

Functions

This section is empty.

Types

type Client

type Client interface {
	// IncCounter increments a counter metric
	IncCounter(scope int, counter int)
	// AddCounter adds delta to the counter metric
	AddCounter(scope int, counter int, delta int64)
	// StartTimer starts a timer for the given
	// metric name. Time will be recorded when stopwatch is stopped.
	StartTimer(scope int, timer int) tally.Stopwatch
	// RecordTimer starts a timer for the given
	// metric name
	RecordTimer(scope int, timer int, d time.Duration)
	// UpdateGauge reports Gauge type metric
	UpdateGauge(scope int, gauge int, delta float64)
	// Tagged returns a client that adds the given tags to all metrics
	Tagged(tags map[string]string) Client
}

Client is the interface used to report metrics tally.

func NewClient

func NewClient(scope tally.Scope, serviceIdx ServiceIdx) Client

NewClient creates and returns a new instance of Client implementation reporter holds the common tags for the servcie serviceIdx indicates the service type in (InputhostIndex, ... StorageIndex)

type ClientImpl

type ClientImpl struct {
	// contains filtered or unexported fields
}

ClientImpl is used for reporting metrics by various Cadence services

func (*ClientImpl) AddCounter

func (m *ClientImpl) AddCounter(scopeIdx int, counterIdx int, delta int64)

AddCounter adds delta to the counter and emits to the metrics backend

func (*ClientImpl) IncCounter

func (m *ClientImpl) IncCounter(scopeIdx int, counterIdx int)

IncCounter increments one for a counter and emits to metrics backend

func (*ClientImpl) RecordTimer

func (m *ClientImpl) RecordTimer(scopeIdx int, timerIdx int, d time.Duration)

RecordTimer record and emit a timer for the given metric name

func (*ClientImpl) StartTimer

func (m *ClientImpl) StartTimer(scopeIdx int, timerIdx int) tally.Stopwatch

StartTimer starts a timer for the given metric name

func (*ClientImpl) Tagged

func (m *ClientImpl) Tagged(tags map[string]string) Client

Tagged returns a client that adds the given tags to all metrics

func (*ClientImpl) UpdateGauge

func (m *ClientImpl) UpdateGauge(scopeIdx int, gaugeIdx int, delta float64)

UpdateGauge reports Gauge type metric

type ErrorClass

type ErrorClass uint8

ErrorClass is an enum to help with classifying SLA vs. non-SLA errors (SLA = "service level agreement")

type MetricName

type MetricName string

MetricName is the name of the metric

type MetricType

type MetricType int

MetricType is the type of the metric

const (
	Counter MetricType = iota
	Timer
	Gauge
)

MetricTypes which are supported

type RuntimeMetricsReporter

type RuntimeMetricsReporter struct {
	// contains filtered or unexported fields
}

RuntimeMetricsReporter A struct containing the state of the RuntimeMetricsReporter.

func NewRuntimeMetricsReporter

func NewRuntimeMetricsReporter(scope tally.Scope, reportInterval time.Duration, logger bark.Logger) *RuntimeMetricsReporter

NewRuntimeMetricsReporter Creates a new RuntimeMetricsReporter.

func (*RuntimeMetricsReporter) Start

func (r *RuntimeMetricsReporter) Start()

Start Starts the reporter thread that periodically emits metrics.

func (*RuntimeMetricsReporter) Stop

func (r *RuntimeMetricsReporter) Stop()

Stop Stops reporting of runtime metrics. The reporter cannot be started again after it's been stopped.

type ServiceIdx

type ServiceIdx int

ServiceIdx is an index that uniquely identifies the service

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL