Skip to content

hamba/cmd

Repository files navigation

Logo

Go Report Card Build Status Coverage Status Go Reference GitHub release GitHub license

Go cmd helper.

This provides helpers on top of github.com/urfave/cli.

Overview

Install with:

go get github.com/hamba/cmd/v2

Example

func yourAction(c *cli.Context) error {
    log, err := cmd.NewLogger(c)
	if err != nil {
		// Handle error.
	}

	stats, err := cmd.NewStatter(c, log)
	if err != nil {
		// Handle error.
	}

    tracer, err := cmd.NewTracer(c, log,
        semconv.ServiceNameKey.String("my-service"),
        semconv.ServiceVersionKey.String("1.0.0"),
    )
    if err != nil {
        // Handle error.
        return
    }
    defer tracer.Shutdown(context.Background())

    // Run your application here...
	
	return nil
}

Flags

Logger

The logger flags are used by cmd.NewLogger to create a hamba.Logger.

FlagLogFormat: --log.format, $LOG_FORMAT

This flag sets the log formatter to use. The available options are logfmt (default), json, console.

Example: --log.format=console

FlagLogLevel: --log.level, $LOG_LEVEL

This flag sets the log level to filer on. The available options are debug, info (default), warn, error, crit.

Example: --log.level=error

FlagLogCtx: --log.ctx, $LOG_CTX

This flag sets contextual key value pairs to set on all log messages. This flag can be specified multiple times.

Example: --log.ctx="app=my-app" --log.ctx="zone=eu-west"

Statter

The statter flags are used by cmd.NewStatter to create a new `hamba.Statter.

FlagStatsDSN: --stats.dsn, $STATS_DSN

This flag sets the DSN describing the stats reporter to use. The available options are statsd, prometheus, l2met, victoriametrics.

The DSN can in some situations specify the host and configuration values as shown in the below examples:

Statsd:

--stats.dsn="statsd://host:port?flushBytes=1432&flushInterval=10s"

The host and port are required. Optionally flushBytes and flushInterval can be set, controlling how often the stats will be sent to the Statsd server.

Prometheus:

--stats.dsn="prometheus://host:port"

or

--stats.dsn="prom://host:port"

The host and port are optional. If set they will start a prometheus http server on the specified host and port.

Victoria Metrics:

--stats.dsn="victoriametrics://host:port"

or

--stats.dsn="vm://host:port"

The host and port are optional. If set they will start a victoria metrics http server on the specified host and port.

l2met:

--stats.dsn="l2met://"

This report has no exposed options.

FlagStatsInterval: --stats.interval, $STATS_INTERVAL

This flag sets the interval at which the aggregated stats will be reported to the reporter.

Example: --stats-interval=10s

FlagStatsPrefix: --stats.prefix, $STATS_PREFIX

This flag sets the prefix attached to all stats keys.

Example: --stats.prefix=my-app.server

FlagStatsTags: --stats.tags, $STATS_TAGS

This flag sets tag key value pairs to set on all stats. This flag can be specified multiple times.

Example: --stats.tags="app=my-app" --stats.tags="zone=eu-west"

Profiler

The profiler flags are used by cmd.NewProfiler to create a Pyroscope *pyroscope.Profiler.

FlagProfilingDSN: --profiling.dsn, $PROFILING_DSN

This flag configures the URL, authentication and optionally the Tenant ID for Pyroscope.

Example: --profiling.dsn=https://user:pass@host/path?token=auth-token&tenantid=my-tenant-id

FlagProfileUploadRate: --profiling.upload-rate, $PROFILING_UPLOAD_RATE

This flag configures the rate at which profiles are uploaded.

Example: --profiling.upload-rate=10s

FlagProfilingTags: --profiling.tags, $PROFILING_TAGS

This configures a list of tags appended to every profile. This flag can be specified multiple times.

Example: --profiling.tags="app=my-app" --profiling.tags="zone=eu-west"

FlagProfilingTypes: --profiling.types, $PROFILING_TYPES

This configures the profile types that are captured. By default all supported types are captured. This flag can be specified multiple times.

Example: --profiling.types=cpu --profiling.types=inuse_object

Tracer

The tracing flags are used by cmd.NewTracer to create a new open telemetry trace.TraceProvider.

FlagTracingExporter: --tracing.exporter, $TRACING_EXPORTER

This flag sets the exporter to send spans to. The available options are zipkin, otlphttp and otlpgrpc.

Example: --tracing.exporter=otlphttp

FlagTracingEndpoint: --tracing.endpoint, $TRACING_ENDPOINT

This flag sets the endpoint the exporter should send traces to.

Example: --tracing.endpoint="agent-host:port" or --tracing.endpoint="http://host:port/api/v2"

FlagTracingEndpointInsecure: --tracing.endpoint-insecure, $TRACING_ENDPOINT_INSECURE

This flag sets the endpoint the exporter should send traces to.

Example: --tracing.endpoint-insecure

FlagTracingRatio: --tracing.ratio, $TRACING_RATIO

This flag sets the sample ratio of spans that will be reported to the exporter. This should be between 0 and 1.

Example: --tracing.ratio=0.2

FlagTracingTags: --tracing.tags, $TRACING_TAGS

This flag sets a list of tags appended to every trace. This flag can be specified multiple times.

Example: --tracing.tags="app=my-app" --tracing.tags="zone=eu-west"

Observer

The observe package exposes an Observer type which is essentially a helper that combines a logger, tracer and statter. It is useful if you use all three for your services and want to avoid carrying around many arguments.

Here is an example of how one might use it:

func yourAction(c *cli.Context) error {
     obsvr, err := observe.NewFromCLI(c, "my-service", &observe.Options{
        LogTimestamps: true,
        StatsRuntime:  true,
        TracingAttrs: []attribute.KeyValue{
            semconv.ServiceVersionKey.String("1.0.0"),
        },
    })
    if err != nil {
        return err
    }
    defer obsvr.Close()

	// Run your application here...

	return nil
}

It also exposes NewFake which allows you to pass fake loggers, tracers and statters in your tests easily.