Full Code of openconfig/gnmic for AI

main 0dd66c0340c8 cached
666 files
3.4 MB
918.8k tokens
2842 symbols
1 requests
Download .txt
Showing preview only (3,675K chars total). Download the full file or copy to clipboard to get everything.
Repository: openconfig/gnmic
Branch: main
Commit: 0dd66c0340c8
Files: 666
Total size: 3.4 MB

Directory structure:
gitextract_xxir9y9t/

├── .dockerignore
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── close_state_issues.yml
│       ├── docs.yml
│       ├── lint.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── Dockerfile
├── LICENSE
├── README.md
├── cmd/
│   └── demo/
│       ├── getresponse.textproto
│       ├── setrequest.textproto
│       ├── setrequest2.textproto
│       └── subscriberesponses.textproto
├── config.json
├── config.toml
├── config.yaml
├── docs/
│   ├── CNAME
│   ├── basic_usage.md
│   ├── blog/
│   │   └── index.md
│   ├── changelog.md
│   ├── cmd/
│   │   ├── capabilities.md
│   │   ├── collector.md
│   │   ├── diff/
│   │   │   ├── diff.md
│   │   │   ├── diff_set_to_notifs.md
│   │   │   └── diff_setrequest.md
│   │   ├── generate/
│   │   │   ├── generate_path.md
│   │   │   └── generate_set_request.md
│   │   ├── generate.md
│   │   ├── get.md
│   │   ├── getset.md
│   │   ├── listen.md
│   │   ├── path.md
│   │   ├── processor.md
│   │   ├── prompt.md
│   │   ├── proxy.md
│   │   ├── set.md
│   │   └── subscribe.md
│   ├── deployments/
│   │   ├── clusters/
│   │   │   ├── containerlab/
│   │   │   │   ├── cluster_with_gnmi_server_and_prometheus_output.md
│   │   │   │   ├── cluster_with_influxdb_output.md
│   │   │   │   ├── cluster_with_nats_input_and_prometheus_output.md
│   │   │   │   └── cluster_with_prometheus_output.md
│   │   │   ├── docker-compose/
│   │   │   │   ├── cluster_with_influxdb_output.md
│   │   │   │   ├── cluster_with_nats_input_and_prometheus_output.md
│   │   │   │   └── cluster_with_prometheus_output.md
│   │   │   └── kubernetes/
│   │   │       └── cluster_with_prometheus_output.md
│   │   ├── deployments_intro.md
│   │   ├── pipelines/
│   │   │   └── docker-compose/
│   │   │       ├── forked_pipeline.md
│   │   │       ├── gnmic_cluster_nats_prometheus.md
│   │   │       ├── nats_influxdb.md
│   │   │       └── nats_prometheus.md
│   │   └── single-instance/
│   │       ├── containerlab/
│   │       │   ├── influxdb-output.md
│   │       │   ├── kafka-output.md
│   │       │   ├── multiple-outputs.md
│   │       │   ├── nats-output.md
│   │       │   ├── prometheus-output.md
│   │       │   └── prometheus-remote-write-output.md
│   │       └── docker-compose/
│   │           ├── influxdb-output.md
│   │           ├── kafka-output.md
│   │           ├── multiple-outputs.md
│   │           ├── nats-output.md
│   │           └── prometheus-output.md
│   ├── global_flags.md
│   ├── index.md
│   ├── install.md
│   ├── stylesheets/
│   │   └── extra.css
│   └── user_guide/
│       ├── HA.md
│       ├── actions/
│       │   └── actions.md
│       ├── api/
│       │   ├── api_intro.md
│       │   ├── cluster.md
│       │   ├── configuration.md
│       │   ├── other.md
│       │   └── targets.md
│       ├── caching.md
│       ├── collector/
│       │   ├── collector_api.md
│       │   ├── collector_configuration.md
│       │   └── collector_intro.md
│       ├── configuration_env.md
│       ├── configuration_file.md
│       ├── configuration_flags.md
│       ├── configuration_intro.md
│       ├── event_processors/
│       │   ├── event_add_tag.md
│       │   ├── event_allow.md
│       │   ├── event_combine.md
│       │   ├── event_convert.md
│       │   ├── event_data_convert.md
│       │   ├── event_date_string.md
│       │   ├── event_delete.md
│       │   ├── event_drop.md
│       │   ├── event_duration_convert.md
│       │   ├── event_extract_tags.md
│       │   ├── event_group_by.md
│       │   ├── event_ieeefloat32.md
│       │   ├── event_jq.md
│       │   ├── event_merge.md
│       │   ├── event_override_ts.md
│       │   ├── event_plugin.md
│       │   ├── event_rate_limit.md
│       │   ├── event_starlark.md
│       │   ├── event_strings.md
│       │   ├── event_time_epoch.md
│       │   ├── event_to_tag.md
│       │   ├── event_trigger.md
│       │   ├── event_value_tag.md
│       │   ├── event_write.md
│       │   └── intro.md
│       ├── gnmi_server.md
│       ├── golang_package/
│       │   ├── examples/
│       │   │   ├── capabilities.md
│       │   │   ├── get.md
│       │   │   ├── set.md
│       │   │   └── subscribe.md
│       │   ├── gnmi_options.md
│       │   ├── intro.md
│       │   └── target_options.md
│       ├── inputs/
│       │   ├── input_intro.md
│       │   ├── jetstream_input.md
│       │   ├── kafka_input.md
│       │   ├── nats_input.md
│       │   └── stan_input.md
│       ├── outputs/
│       │   ├── asciigraph_output.md
│       │   ├── file_output.md
│       │   ├── gnmi_output.md
│       │   ├── influxdb_output.md
│       │   ├── jetstream_output.md
│       │   ├── kafka_output.md
│       │   ├── nats_output.md
│       │   ├── otlp_output.md
│       │   ├── output_intro.md
│       │   ├── prometheus_output.md
│       │   ├── prometheus_write_output.md
│       │   ├── snmp_output.md
│       │   ├── stan_output.md
│       │   ├── tcp_output.md
│       │   └── udp_output.md
│       ├── prompt_suggestions.md
│       ├── subscriptions.md
│       ├── targets/
│       │   ├── target_discovery/
│       │   │   ├── consul_discovery.md
│       │   │   ├── discovery_intro.md
│       │   │   ├── docker_discovery.md
│       │   │   ├── file_discovery.md
│       │   │   └── http_discovery.md
│       │   ├── targets.md
│       │   └── targets_session_sec.md
│       └── tunnel_server.md
├── examples/
│   ├── deployments/
│   │   ├── 1.single-instance/
│   │   │   ├── 1.nats-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── nats.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 10.prometheus-with-cache/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       ├── prometheus/
│   │   │   │       │   └── prometheus.yaml
│   │   │   │       └── prometheus.clab.yaml
│   │   │   ├── 11.kafka-kraft-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── kafka.clab.yaml
│   │   │   ├── 2.kafka-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── kafka.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 3.influxdb-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   └── influxdb.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 4.prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── prometheus/
│   │   │   │   │   │   └── prometheus.yaml
│   │   │   │   │   └── prometheus.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic1.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 5.multiple-outputs/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── multiple-outputs.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic1.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 6.prometheus-write-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       ├── prometheus/
│   │   │   │       │   └── prometheus.yaml
│   │   │   │       └── prometheus.clab.yaml
│   │   │   ├── 7.cortex-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── cortex/
│   │   │   │       │   └── single-process-config-blocks.yaml
│   │   │   │       ├── cortexmetrics.clab.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── grafana/
│   │   │   │           └── datasources/
│   │   │   │               └── datasource.yaml
│   │   │   ├── 8.victoria-metrics-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       └── victoriametrics.clab.yaml
│   │   │   └── 9.jetstream-output/
│   │   │       └── containerlab/
│   │   │           ├── gnmic.yaml
│   │   │           └── jetstream.clab.yaml
│   │   ├── 2.clusters/
│   │   │   ├── 1.influxdb-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   └── lab21.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic.yaml
│   │   │   ├── 2.prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── lab22.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   ├── docker-compose/
│   │   │   │   │   ├── docker-compose.yaml
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── kubernetes/
│   │   │   │       ├── consul/
│   │   │   │       │   ├── deployment.yaml
│   │   │   │       │   └── service.yaml
│   │   │   │       ├── gnmic-app/
│   │   │   │       │   ├── configmap.yaml
│   │   │   │       │   ├── secret.yaml
│   │   │   │       │   ├── service.yaml
│   │   │   │       │   └── statefulset.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── servicemonitor.yaml
│   │   │   ├── 3.nats-input-prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── lab23.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 4.gnmi-server/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmi-server.clab.yaml
│   │   │   │       ├── gnmic-agg.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   ├── dashboards/
│   │   │   │       │   │   └── gNMIc/
│   │   │   │       │   │       ├── gnmic_compute_metrics.json
│   │   │   │       │   │       └── gnmic_grpc_metrics.json
│   │   │   │       │   ├── dashboards.yaml
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   └── 5.shared-cache/
│   │   │       ├── jetstream/
│   │   │       │   └── containerlab/
│   │   │       │       ├── gnmic.yaml
│   │   │       │       ├── grafana/
│   │   │       │       │   └── datasources/
│   │   │       │       │       └── datasource.yaml
│   │   │       │       ├── lab25-1.clab.yaml
│   │   │       │       └── prometheus/
│   │   │       │           └── prometheus.yaml
│   │   │       ├── nats/
│   │   │       │   └── containerlab/
│   │   │       │       ├── gnmic.yaml
│   │   │       │       ├── grafana/
│   │   │       │       │   └── datasources/
│   │   │       │       │       └── datasource.yaml
│   │   │       │       ├── lab25-2.clab.yaml
│   │   │       │       └── prometheus/
│   │   │       │           └── prometheus.yaml
│   │   │       └── redis/
│   │   │           └── containerlab/
│   │   │               ├── gnmic.yaml
│   │   │               ├── grafana/
│   │   │               │   └── datasources/
│   │   │               │       └── datasource.yaml
│   │   │               ├── lab25-3.clab.yaml
│   │   │               └── prometheus/
│   │   │                   └── prometheus.yaml
│   │   └── 3.pipelines/
│   │       ├── 1.gnmic-nats-gnmic-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-collector.yaml
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab31.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       ├── 2.gnmic-nats-gnmic-influxdb/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-collector.yaml
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   └── lab32.clab.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       └── gnmic-relay.yaml
│   │       ├── 3a.gnmic-cluster-nats-gnmic-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── gnmic.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab33a.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       ├── 3b.gnmic-cluster-nats-gnmic-cluster-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── gnmic.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab33b.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       └── 4.gnmic-nats-gnmic-prometheus-gnmic-influxdb/
│   │           └── docker-compose/
│   │               ├── docker-compose.yaml
│   │               ├── gnmic-collector.yaml
│   │               ├── gnmic-relay1.yaml
│   │               ├── gnmic-relay2.yaml
│   │               └── prometheus/
│   │                   └── prometheus.yaml
│   ├── pkg/
│   │   ├── capabilities_rpc/
│   │   │   └── main.go
│   │   ├── get_rpc/
│   │   │   └── main.go
│   │   ├── set_rpc/
│   │   │   └── main.go
│   │   └── subscribe_rpc/
│   │       └── main.go
│   ├── plugins/
│   │   ├── demo/
│   │   │   └── main.go
│   │   ├── event-add-hostname/
│   │   │   ├── README.md
│   │   │   └── event-add-hostname.go
│   │   ├── event-gnmi-get/
│   │   │   ├── README.md
│   │   │   └── event-gnmi-get.go
│   │   ├── go-event-plugin/
│   │   │   └── event-go-plugin.go
│   │   └── minimal/
│   │       └── event-my-processor.go
│   └── set-request-templates/
│       └── Nokia/
│           └── SRL/
│               ├── 1.interfaces/
│               │   ├── interfaces_template.gotmpl
│               │   ├── interfaces_template_vars.yaml
│               │   └── subinterfaces_template.gotmpl
│               ├── 2.network-instance/
│               │   ├── network_instance_bgp_evpn_template.gotmpl
│               │   ├── network_instance_bgp_template.gotmpl
│               │   ├── network_instance_bgp_vpn_template.gotmpl
│               │   ├── network_instance_template.gotmpl
│               │   └── network_instance_template_vars.yaml
│               └── 3.acl/
│                   ├── acl_template.gotmpl
│                   └── acl_template_vars.yaml
├── go.mod
├── go.sum
├── goreleaser-alpine.dockerfile
├── goreleaser-scratch.dockerfile
├── install.sh
├── main.go
├── mkdocs.yml
├── pkg/
│   ├── actions/
│   │   ├── action.go
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── gnmi_action/
│   │   │   ├── gnmi_action.go
│   │   │   ├── gnmi_action_test.go
│   │   │   └── options.go
│   │   ├── http_action/
│   │   │   ├── http_action.go
│   │   │   └── http_action_test.go
│   │   ├── script_action/
│   │   │   ├── options.go
│   │   │   └── script_action.go
│   │   └── template_action/
│   │       ├── options.go
│   │       └── template_action.go
│   ├── api/
│   │   ├── gnmi_msgs.go
│   │   ├── gnmi_msgs_test.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── path/
│   │   │   ├── path.go
│   │   │   └── path_test.go
│   │   ├── server/
│   │   │   ├── options.go
│   │   │   └── server.go
│   │   ├── target/
│   │   │   ├── subscribe.go
│   │   │   └── target.go
│   │   ├── target.go
│   │   ├── target_test.go
│   │   ├── testutils/
│   │   │   └── utils.go
│   │   ├── tunnel.go
│   │   ├── tunnel_test.go
│   │   ├── types/
│   │   │   ├── sasl.go
│   │   │   ├── subscription.go
│   │   │   ├── target.go
│   │   │   └── tls.go
│   │   └── utils/
│   │       ├── tls.go
│   │       ├── utils.go
│   │       └── utils_test.go
│   ├── app/
│   │   ├── api.go
│   │   ├── app.go
│   │   ├── capabilities.go
│   │   ├── clustering.go
│   │   ├── clustering_test.go
│   │   ├── const.go
│   │   ├── diff.go
│   │   ├── generate.go
│   │   ├── generatePath.go
│   │   ├── get.go
│   │   ├── getset.go
│   │   ├── gnmi_client.go
│   │   ├── gnmi_client_subscribe.go
│   │   ├── gnmi_server.go
│   │   ├── inputs.go
│   │   ├── loaders.go
│   │   ├── locker.go
│   │   ├── logging.go
│   │   ├── metrics.go
│   │   ├── outputs.go
│   │   ├── path.go
│   │   ├── path_test.go
│   │   ├── plugins.go
│   │   ├── pprof.go
│   │   ├── processor.go
│   │   ├── prompt.go
│   │   ├── proxy.go
│   │   ├── routes.go
│   │   ├── set-to-notifs.go
│   │   ├── set.go
│   │   ├── setrequest.go
│   │   ├── subscribe.go
│   │   ├── subscribe_once.go
│   │   ├── subscribe_poll.go
│   │   ├── subscribe_prompt.go
│   │   ├── target.go
│   │   ├── tree.go
│   │   ├── tunnel.go
│   │   ├── utils.go
│   │   └── version.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── jetstream_cache.go
│   │   ├── jetstream_cache_test.go
│   │   ├── nats_cache.go
│   │   ├── oc_cache.go
│   │   ├── oc_cache_test.go
│   │   ├── options.go
│   │   └── redis_cache.go
│   ├── cmd/
│   │   ├── capabilities/
│   │   │   └── capabilities.go
│   │   ├── collector/
│   │   │   ├── collector.go
│   │   │   ├── inputs.go
│   │   │   ├── ouputs.go
│   │   │   ├── processors.go
│   │   │   ├── subscriptions.go
│   │   │   └── targets.go
│   │   ├── completion.go
│   │   ├── diff/
│   │   │   └── diff.go
│   │   ├── generate/
│   │   │   ├── generate.go
│   │   │   ├── generatePath.go
│   │   │   └── generateSetRequest.go
│   │   ├── get/
│   │   │   └── get.go
│   │   ├── getset/
│   │   │   └── getset.go
│   │   ├── listener/
│   │   │   └── listener.go
│   │   ├── path/
│   │   │   └── path.go
│   │   ├── processor/
│   │   │   └── processor.go
│   │   ├── prompt.go
│   │   ├── prompt_test.go
│   │   ├── proxy/
│   │   │   └── proxy.go
│   │   ├── root.go
│   │   ├── set/
│   │   │   └── set.go
│   │   ├── subscribe/
│   │   │   └── subscribe.go
│   │   ├── tree/
│   │   │   └── tree.go
│   │   └── version/
│   │       ├── version.go
│   │       └── versionUpgrade.go
│   ├── collector/
│   │   ├── api/
│   │   │   ├── const/
│   │   │   │   └── const.go
│   │   │   └── server/
│   │   │       ├── apiserver.go
│   │   │       ├── apply.go
│   │   │       ├── assignment.go
│   │   │       ├── cluster.go
│   │   │       ├── inputs.go
│   │   │       ├── metrics.go
│   │   │       ├── outputs.go
│   │   │       ├── processors.go
│   │   │       ├── routes.go
│   │   │       ├── sse.go
│   │   │       ├── subscriptions.go
│   │   │       ├── targets.go
│   │   │       └── tunnel_target_match.go
│   │   ├── collector.go
│   │   ├── env/
│   │   │   ├── env.go
│   │   │   └── env_test.go
│   │   ├── managers/
│   │   │   ├── cluster/
│   │   │   │   ├── assigner.go
│   │   │   │   ├── cluster_manager.go
│   │   │   │   ├── election.go
│   │   │   │   ├── membership.go
│   │   │   │   ├── placement.go
│   │   │   │   ├── rebalance.go
│   │   │   │   └── utils.go
│   │   │   ├── inputs/
│   │   │   │   └── inputs_manager.go
│   │   │   ├── outputs/
│   │   │   │   └── outputs_manager.go
│   │   │   └── targets/
│   │   │       ├── cluster.go
│   │   │       ├── loader.go
│   │   │       ├── metrics.go
│   │   │       ├── targets_manager.go
│   │   │       └── tunnel_server.go
│   │   └── store/
│   │       ├── store.go
│   │       └── types.go
│   ├── config/
│   │   ├── actions.go
│   │   ├── api_server.go
│   │   ├── clustering.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── diff.go
│   │   ├── environment.go
│   │   ├── gnmi_ext.go
│   │   ├── gnmi_server.go
│   │   ├── inputs.go
│   │   ├── loader.go
│   │   ├── locker.go
│   │   ├── outputs.go
│   │   ├── outputs_test.go
│   │   ├── plugins.go
│   │   ├── processors.go
│   │   ├── processors_test.go
│   │   ├── set.go
│   │   ├── set_test.go
│   │   ├── subscriptions.go
│   │   ├── subscriptions_test.go
│   │   ├── targets.go
│   │   ├── targets_test.go
│   │   └── tunnel_server.go
│   ├── file/
│   │   └── file.go
│   ├── formatters/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── event.go
│   │   ├── event_add_tag/
│   │   │   ├── event_add_tag.go
│   │   │   └── event_add_tag_test.go
│   │   ├── event_allow/
│   │   │   ├── event_allow.go
│   │   │   └── event_allow_test.go
│   │   ├── event_combine/
│   │   │   ├── event_combine.go
│   │   │   └── event_combine_test/
│   │   │       └── event_combine_test.go
│   │   ├── event_convert/
│   │   │   ├── event_convert.go
│   │   │   └── event_convert_test.go
│   │   ├── event_data_convert/
│   │   │   ├── event_data_convert.go
│   │   │   └── event_data_convert_test.go
│   │   ├── event_date_string/
│   │   │   ├── event_date_string.go
│   │   │   └── event_date_string_test.go
│   │   ├── event_delete/
│   │   │   ├── event_delete.go
│   │   │   └── event_delete_test.go
│   │   ├── event_drop/
│   │   │   ├── event_drop.go
│   │   │   └── event_drop_test.go
│   │   ├── event_duration_convert/
│   │   │   ├── event_duration_convert.go
│   │   │   └── event_duration_convert_test.go
│   │   ├── event_extract_tags/
│   │   │   ├── event_extract_tags.go
│   │   │   └── event_extract_tags_test.go
│   │   ├── event_group_by/
│   │   │   ├── event_group_by.go
│   │   │   └── event_group_by_test.go
│   │   ├── event_ieeefloat32/
│   │   │   ├── event_ieeefloat32.go
│   │   │   └── event_ieeefloat32_test.go
│   │   ├── event_jq/
│   │   │   ├── event_jq.go
│   │   │   └── event_jq_test.go
│   │   ├── event_merge/
│   │   │   ├── event_merge.go
│   │   │   └── event_merge_test.go
│   │   ├── event_override_ts/
│   │   │   ├── event_override_ts.go
│   │   │   └── event_override_ts_test.go
│   │   ├── event_plugin/
│   │   │   ├── plugin.go
│   │   │   └── rpc.go
│   │   ├── event_rate_limit/
│   │   │   ├── event_rate_limit.go
│   │   │   └── event_rate_limit_test.go
│   │   ├── event_starlark/
│   │   │   ├── dict.go
│   │   │   ├── event.go
│   │   │   ├── event_starlark.go
│   │   │   └── event_starlark_test.go
│   │   ├── event_strings/
│   │   │   ├── event_strings.go
│   │   │   └── event_strings_test.go
│   │   ├── event_test.go
│   │   ├── event_time_epoch/
│   │   │   ├── event_time_epoch.go
│   │   │   └── event_time_epoch_test.go
│   │   ├── event_to_tag/
│   │   │   ├── event_to_tag.go
│   │   │   └── event_to_tag_test.go
│   │   ├── event_trigger/
│   │   │   ├── event_trigger.go
│   │   │   └── event_trigger_test.go
│   │   ├── event_value_tag/
│   │   │   ├── event_value_tag.go
│   │   │   └── event_value_tag_test.go
│   │   ├── event_value_tag_v2/
│   │   │   ├── event_value_tag_v2.go
│   │   │   └── event_value_tag_v2_test.go
│   │   ├── event_write/
│   │   │   ├── event_write.go
│   │   │   └── event_write_test.go
│   │   ├── flat.go
│   │   ├── formats.go
│   │   ├── json.go
│   │   ├── msg.go
│   │   ├── plugin_manager/
│   │   │   └── manager.go
│   │   ├── processors.go
│   │   └── processors_test.go
│   ├── gtemplate/
│   │   ├── template.go
│   │   └── template_funcs.go
│   ├── inputs/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── input.go
│   │   ├── jetstream_input/
│   │   │   ├── jetstream_input.go
│   │   │   └── jetstream_input_test.go
│   │   ├── kafka_input/
│   │   │   ├── kafka_input.go
│   │   │   └── kafka_scram_client.go
│   │   └── nats_input/
│   │       └── nats_input.go
│   ├── loaders/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── consul_loader/
│   │   │   ├── consul_loader.go
│   │   │   ├── consul_loader_metrics.go
│   │   │   ├── consul_loader_test.go
│   │   │   └── options.go
│   │   ├── docker_loader/
│   │   │   ├── docker_loader.go
│   │   │   ├── docker_loader_metrics.go
│   │   │   └── options.go
│   │   ├── file_loader/
│   │   │   ├── file_loader.go
│   │   │   ├── file_loader_metrics.go
│   │   │   └── options.go
│   │   ├── http_loader/
│   │   │   ├── http_loader.go
│   │   │   ├── http_loader_metrics.go
│   │   │   ├── http_loader_test.go
│   │   │   └── options.go
│   │   ├── loaders.go
│   │   ├── loaders_test.go
│   │   └── option.go
│   ├── lockers/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── consul_locker/
│   │   │   ├── consul_locker.go
│   │   │   └── consul_registration.go
│   │   ├── k8s_locker/
│   │   │   ├── k8s_locker.go
│   │   │   └── k8s_registration.go
│   │   ├── locker.go
│   │   └── redis_locker/
│   │       ├── redis_locker.go
│   │       └── redis_registration.go
│   ├── logging/
│   │   └── logging.go
│   ├── outputs/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── asciigraph_output/
│   │   │   └── asciigraph.go
│   │   ├── file/
│   │   │   ├── file_metrics.go
│   │   │   ├── file_output.go
│   │   │   └── rotating_file.go
│   │   ├── gnmi_output/
│   │   │   ├── gnmi_output.go
│   │   │   ├── gnmi_server.go
│   │   │   ├── gnmi_server_get.go
│   │   │   ├── gnmi_server_set.go
│   │   │   └── gnmi_server_subscribe.go
│   │   ├── influxdb_output/
│   │   │   ├── influxdb_cache.go
│   │   │   └── influxdb_output.go
│   │   ├── kafka_output/
│   │   │   ├── kafka_metrics.go
│   │   │   ├── kafka_output.go
│   │   │   └── kafka_scram_client.go
│   │   ├── nats_outputs/
│   │   │   ├── jetstream/
│   │   │   │   ├── jetstream_output.go
│   │   │   │   ├── jetstream_output_metrics.go
│   │   │   │   └── jetstream_output_test.go
│   │   │   └── nats/
│   │   │       ├── nats_metrics.go
│   │   │       └── nats_output.go
│   │   ├── options.go
│   │   ├── otlp_output/
│   │   │   ├── otlp_converter.go
│   │   │   ├── otlp_metrics.go
│   │   │   ├── otlp_output.go
│   │   │   └── otlp_output_test.go
│   │   ├── output.go
│   │   ├── prometheus_output/
│   │   │   ├── prometheus_common.go
│   │   │   ├── prometheus_common_test.go
│   │   │   ├── prometheus_output/
│   │   │   │   ├── prometheus_cache.go
│   │   │   │   ├── prometheus_metrics.go
│   │   │   │   ├── prometheus_output.go
│   │   │   │   └── prometheus_service_registration.go
│   │   │   └── prometheus_write_output/
│   │   │       ├── prometheus_write_client.go
│   │   │       ├── prometheus_write_metrics.go
│   │   │       └── prometheus_write_output.go
│   │   ├── protometa.go
│   │   ├── snmp_output/
│   │   │   ├── snmp_metrics.go
│   │   │   └── snmp_output.go
│   │   ├── tcp_output/
│   │   │   └── tcp_output.go
│   │   └── udp_output/
│   │       └── udp_output.go
│   ├── pipeline/
│   │   └── pipeline.go
│   ├── utils/
│   │   ├── authbrearer.go
│   │   ├── gnmi.go
│   │   ├── gnmiext.go
│   │   └── store.go
│   └── version/
│       └── version.go
└── tests/
    ├── api.sh
    ├── capabilities_cmd.sh
    ├── clab/
    │   ├── labN.clab.yaml
    │   ├── loaders/
    │   │   ├── gnmic-agg.yaml
    │   │   ├── gnmic-docker-loader.yaml
    │   │   ├── gnmic-file-loader.yaml
    │   │   ├── loaders.clab.yaml
    │   │   ├── loaders.clab_vars.yaml
    │   │   └── targets/
    │   │       └── targets.yaml
    │   ├── telemetry/
    │   │   ├── gnmic-agg.yaml
    │   │   ├── gnmic.yaml
    │   │   ├── grafana/
    │   │   │   ├── dashboards.yaml
    │   │   │   └── datasources/
    │   │   │       └── datasource.yaml
    │   │   ├── prometheus/
    │   │   │   └── prometheus.yaml
    │   │   └── telemetry.clab.yaml
    │   └── test_lab1.clab.yaml
    ├── cleanup.sh
    ├── cluster_checks.sh
    ├── cluster_funcs.sh
    ├── configs/
    │   ├── gnmic1.yaml
    │   ├── gnmic2.yaml
    │   ├── gnmic3.yaml
    │   ├── gnmic4.yaml
    │   ├── gnmic_env.yaml
    │   └── node/
    │       ├── interface.json
    │       ├── interface.yaml
    │       ├── replace_request_file.yaml
    │       └── update_request_file.yaml
    ├── consul_templates/
    │   └── all_services.tpl
    ├── dashboards/
    │   └── gNMIc/
    │       ├── gnmic_compute_metrics.json
    │       └── gnmic_grpc_metrics.json
    ├── deploy.sh
    ├── env_vars.sh
    ├── generate_cmd.sh
    ├── generate_path_cmd.sh
    ├── get_cmd.sh
    ├── loaders.sh
    ├── metrics/
    │   ├── gnmic.yaml
    │   ├── grafana/
    │   │   ├── dashboards.yaml
    │   │   └── datasources/
    │   │       └── datasource.yaml
    │   ├── metrics.clab.yaml
    │   ├── prometheus/
    │   │   └── prometheus.yaml
    │   └── run.sh
    ├── run.sh
    ├── run_tests.sh
    ├── set_cmd.sh
    ├── subscribe_once_cmd.sh
    ├── telemetry_labs.sh
    └── version_cmd.sh

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
tests/
docs/

================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
  -   package-ecosystem: "github-actions"
      directory: "/"
      schedule:
          interval: "weekly"
  -   package-ecosystem: "gomod"
      directory: "/"
      schedule:
          interval: "weekly"

================================================
FILE: .github/workflows/close_state_issues.yml
================================================
# © 2024 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

name: Close inactive issues
on:
  schedule:
    - cron: "30 1 * * *"

jobs:
  close-issues:
    runs-on: ubuntu-latest
    permissions:
      issues: write
      pull-requests: write
    steps:
      - uses: actions/stale@v10
        with:
          days-before-issue-stale: 365
          days-before-issue-close: 30
          stale-issue-label: "stale"
          stale-issue-message: "This issue is stale because it has been open for 12 months with no activity."
          close-issue-message: "This issue was closed because it has been inactive for 30 days since being marked as stale."
          days-before-pr-stale: -1
          days-before-pr-close: -1
          repo-token: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/docs.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

name: docs
on:
  workflow_dispatch:
  push:
    branches:
      - "docs-*"
    tags:
      - "v*"

env:
  MKDOCS_MATERIAL_VER: 8.3.4

jobs:
  publish:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
      - uses: actions/checkout@v4
      - run: docker run -v $(pwd):/docs --entrypoint ash squidfunk/mkdocs-material:${MKDOCS_MATERIAL_VER} -c 'git config --global --add safe.directory /docs; mkdocs gh-deploy --force --strict'


================================================
FILE: .github/workflows/lint.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

---
name: Linter
on:
  workflow_dispatch:
  # pull_request:
  # push:
  #   branches:
  #     - "main"
  #     - "!releases/**"
  
env:
  GOVER: 1.24.12

jobs:
  lint:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GOVER }}
      - name: golangci-lint
        uses: golangci/golangci-lint-action@v9
        with:
          # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
          version: v1.46
          # Optional: working directory, useful for monorepos
          # working-directory: somedir

          # Optional: golangci-lint command line arguments.
          args: --verbose --max-same-issues=0 --max-issues-per-linter=0  --out-format=github-actions

          # Optional: show only new issues if it's a pull request. The default value is `false`.
          # only-new-issues: true

================================================
FILE: .github/workflows/release.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

---
name: release
on:
  push:
    tags:
      - v*
env:
  GOVER: 1.24.12
  GORELEASER_VER: v2.13.3

jobs:
  test:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GOVER }}
      - run: ./tests/run_tests.sh
        env:
          CGO_ENABLED: 0

  release:
    runs-on: ubuntu-22.04
    permissions:
      contents: write
      packages: write

    needs:
      - test
    steps:
      - uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GOVER }}

      - name: Login to github container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Release with goreleaser
        uses: goreleaser/goreleaser-action@v6
        with:
          version: ${{ env.GORELEASER_VER }}
          args: release --clean --verbose
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/test.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

---
name: Test
on:
  workflow_dispatch:
  pull_request:
  push:
    branches:
      - "main"
      - "!releases/**"
env:
  GOVER: 1.24.12

jobs:
  test:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v6
      - uses: actions/setup-go@v6
        with:
          go-version: ${{ env.GOVER }}
      - run: ./tests/run_tests.sh
        env:
          CGO_ENABLED: 0
      # run staticcheck
      - uses: reviewdog/action-staticcheck@73cfd0daa6fdbba9a858dcb0f62844012fa8317d
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          # Change reviewdog reporter if you need [github-pr-check,github-check,github-pr-review].
          reporter: github-pr-review
          # Report all results.
          filter_mode: nofilter
          # Exit with 1 when it find at least one finding.
          fail_on_error: true


================================================
FILE: .gitignore
================================================
_test/
tests/clab-*
tests/srl-*
tests/.*clab.yaml
tests/collector/suite/*/clab-*
builds/
dist
*.log
gnmic
*.tmp
*.work*
.idea
tests/collector

================================================
FILE: .golangci.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

linters-settings:
  govet:
    # check-shadowing: true
    enable:
      - fieldalignment
  gocyclo:
    min-complexity: 20
  dupl:
    threshold: 100
  goconst:
    min-len: 2
    min-occurrences: 4
  lll:
    line-length: 140
  nolintlint:
    # allow-leading-space: true # don't require machine-readable nolint directives (i.e. with no leading space)
    allow-unused: false # report any unused nolint directives
    require-explanation: false # don't require an explanation for nolint directives
    require-specific: false # don't require nolint directives to be specific about which linter is being skipped

linters:
  disable-all: true
  enable:
    - asciicheck
    - bodyclose
    # - deadcode
    # - depguard
    - dogsled
    # - dupl
    # - errcheck
    # - exhaustive
    # - exportloopref
    # - funlen
    # - gci
    # - gochecknoglobals
    # - gochecknoinits
    # - gocognit
    - goconst
    # - gocritic
    # - gocyclo
    # - godox
    - gofmt
    # - gofumpt
    - goheader
    # - goimports
    # - gomnd
    # - gomodguard
    # - goprintffuncname
    # - gosec
    # - gosimple
    # - govet
    # - ineffassign
    # - lll
    - misspell
    # - nakedret
    # - nestif
    # - nlreturn
    # - noctx
    - nolintlint
    - prealloc
    # - revive
    # - rowserrcheck
    # - sqlclosecheck
    # - staticcheck
    # - structcheck
    # - stylecheck
    # - typecheck
    # - unconvert
    # - unparam
    - unused
    # - varcheck
    # - whitespace
    # - wsl

run:
  concurrency: 4
  timeout: 5m

================================================
FILE: .goreleaser.yml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

version: 2
project_name: gnmic
builds:
  - env:
      - CGO_ENABLED=0
    ldflags:
      - -s -w -X github.com/openconfig/gnmic/pkg/version.Version={{.Version}} -X github.com/openconfig/gnmic/pkg/version.Commit={{.ShortCommit}} -X github.com/openconfig/gnmic/pkg/version.Date={{.Date}} -X github.com/openconfig/gnmic/pkg/version.GitURL={{.GitURL}}
    goos:
      - linux
      - darwin
    goarch:
      - amd64
      - "386"
      - arm
      - arm64
dockers:
  - goos: linux
    goarch: amd64
    ids:
      - gnmic
    image_templates:
      - &amd64_latest_image "ghcr.io/openconfig/gnmic:latest-amd64"
      - &amd64_versioned_image 'ghcr.io/openconfig/gnmic:{{ replace .Version "v" ""}}-amd64'
    dockerfile: goreleaser-alpine.dockerfile
    skip_push: false
    use: buildx
    build_flag_templates:
      - "--platform=linux/amd64"
      - "--provenance=false"
      - "--sbom=false"
  - goos: linux
    goarch: arm64
    ids:
      - gnmic
    image_templates:
      - &arm64_latest_image "ghcr.io/openconfig/gnmic:latest-arm64"
      - &arm64_versioned_image 'ghcr.io/openconfig/gnmic:{{ replace .Version "v" ""}}-arm64'
    dockerfile: goreleaser-alpine.dockerfile
    skip_push: false
    use: buildx
    build_flag_templates:
      - "--platform=linux/arm64"
      - "--provenance=false"
      - "--sbom=false"
  - goos: linux
    goarch: amd64
    ids:
      - gnmic
    image_templates:
      - "ghcr.io/openconfig/gnmic:latest-scratch"
      - 'ghcr.io/openconfig/gnmic:{{ replace .Version "v" ""}}-scratch'
    dockerfile: goreleaser-scratch.dockerfile
    skip_push: false
    use: buildx
    build_flag_templates:
      - "--platform=linux/amd64"
      - "--provenance=false"
      - "--sbom=false"
docker_manifests:
  - name_template: 'ghcr.io/openconfig/gnmic:{{ replace .Version "v" "" }}'
    image_templates:
      - *amd64_versioned_image
      - *arm64_versioned_image
  - name_template: "{{- if not .IsSnapshot}}ghcr.io/openconfig/gnmic:latest{{- end}}"
    image_templates:
      - *amd64_latest_image
      - *arm64_latest_image
archives:
  - name_template: >-
      {{ .ProjectName }}_
      {{- .Version }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else if eq .Arch "arm" }}armv7
      {{- else if eq .Arch "arm64" }}aarch64
      {{- else }}{{ .Arch }}{{ end }}
checksum:
  name_template: "checksums.txt"
snapshot:
  name_template: "{{ .Tag }}"
changelog:
  use: github-native

nfpms:
  - id: gnmic
    file_name_template: >-
      {{ .ProjectName }}_
      {{- .Version }}_
      {{- title .Os }}_
      {{- if eq .Arch "amd64" }}x86_64
      {{- else if eq .Arch "386" }}i386
      {{- else if eq .Arch "arm" }}armv7
      {{- else if eq .Arch "arm64" }}aarch64
      {{- else }}{{ .Arch }}{{ end }}
    vendor: gnmic
    homepage: https://gnmic.openconfig.net
    maintainer: Karim Radhouani <medkarimrdi@gmail.com>, Roman Dodin <dodin.roman@gmail.com>
    description: gNMI CLI client and collector
    license: Apache 2.0
    formats:
      - deb
      - rpm
    bindir: /usr/local/bin


================================================
FILE: Dockerfile
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

FROM golang:1.24.12 AS builder

WORKDIR /build

COPY go.mod go.sum /build/
COPY pkg/api/go.mod pkg/api/go.sum /build/pkg/api/
COPY pkg/cache/go.mod pkg/cache/go.sum /build/pkg/cache/
RUN go mod download

ADD . /build

#RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o gnmic .
RUN CGO_ENABLED=0 go build -ldflags="-s -w" -o gnmic .

FROM alpine
LABEL org.opencontainers.image.source=https://github.com/openconfig/gnmic
COPY --from=builder /build/gnmic /app/
WORKDIR /app
ENTRYPOINT [ "/app/gnmic" ]
CMD [ "help" ]


================================================
FILE: LICENSE
================================================

                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<p align=center><img src=docs/images/gnmic-headline.svg?sanitize=true/></p>

[![github release](https://img.shields.io/github/release/openconfig/gnmic.svg?style=flat-square&color=00c9ff&labelColor=bec8d2)](https://github.com/openconfig/gnmic/releases/)
[![Github all releases](https://img.shields.io/github/downloads/openconfig/gnmic/total.svg?style=flat-square&color=00c9ff&labelColor=bec8d2)](https://github.com/openconfig/gnmic/releases/)
[![Go Report](https://img.shields.io/badge/go%20report-A%2B-blue?style=flat-square&color=00c9ff&labelColor=bec8d2)](https://goreportcard.com/report/github.com/openconfig/gnmic)
[![Doc](https://img.shields.io/badge/Docs-gnmic.openconfig.net-blue?style=flat-square&color=00c9ff&labelColor=bec8d2)](https://gnmic.openconfig.net)
[![build](https://img.shields.io/github/actions/workflow/status/openconfig/gnmic/test.yml?branch=main&style=flat-square&labelColor=bec8d2)](https://github.com/openconfig/gnmic/releases/)

---

`gnmic` (_pronoun.: gee·en·em·eye·see_) is a gNMI CLI client that provides full support for Capabilities, Get, Set and Subscribe RPCs with collector capabilities.

Documentation available at [https://gnmic.openconfig.net](https://gnmic.openconfig.net)

## Features

* **Full support for gNMI RPCs**  
  Every gNMI RPC has a [corresponding command](https://gnmic.openconfig.net/basic_usage/) with all of the RPC options configurable by means of the local and global flags.
* **Flexible collector deployment**  
  `gnmic` can be deployed as a gNMI collector that supports multiple output types ([NATS](https://gnmic.openconfig.net/user_guide/outputs/nats_output/), [Kafka](https://gnmic.openconfig.net/user_guide/outputs/kafka_output/), [Prometheus](https://gnmic.openconfig.net/user_guide/outputs/prometheus_output/), [InfluxDB](https://gnmic.openconfig.net/user_guide/outputs/influxdb_output/),...).  
  The collector can be deployed either as a [single instance](https://gnmic.openconfig.net/deployments/deployments_intro/#single-instance), as part of a [cluster](https://gnmic.openconfig.net/user_guide/HA/), or used to form [data pipelines](https://gnmic.openconfig.net/deployments/deployments_intro/#pipelines).
* **Support gRPC tunnel based dialout telemetry**  
  `gnmic` can be deployed as a gNMI collector with an [embedded tunnel server](https://gnmic.openconfig.net/user_guide/tunnel_server/).
* **gNMI data manipulation**  
  `gnmic` collector has [data transformation](https://gnmic.openconfig.net/user_guide/event_processors/intro/) capabilities that can be used to adapt the collected data to your specific use case.
* **Dynamic targets loading**  
  `gnmic` support [target loading at runtime](https://gnmic.openconfig.net/user_guide/targets/target_discovery/discovery_intro/) based on input from external systems.
* **YANG-based path suggestions**  
  Your CLI magically becomes a YANG browser when `gnmic` is executed in [prompt](https://gnmic.openconfig.net/user_guide/prompt_suggestions/) mode. In this mode the flags that take XPATH values will get auto-suggestions based on the provided YANG modules. In other words - voodoo magic :exploding_head:
* **Multi-target operations**  
  Commands can operate on [multiple gNMI targets](https://gnmic.openconfig.net/user_guide/targets/) for bulk configuration/retrieval/subscription.
* **Multiple configuration sources**  
  gnmic supports [flags](https://gnmic.openconfig.net/user_guide/configuration_flags), [environment variables](https://gnmic.openconfig.net/user_guide/configuration_env/) as well as [file based]((https://gnmic.openconfig.net/user_guide/configuration_file/)) configurations.
* **Inspect raw gNMI messages**  
  With the `prototext` output format you can see the actual gNMI messages being sent/received. Its like having a gNMI looking glass!
* **(In)secure gRPC connection**  
  gNMI client supports both TLS and [non-TLS](https://gnmic.openconfig.net/global_flags/#insecure) transports so you can start using it in a lab environment without having to care about the PKI.
* **Dial-out telemetry**  
  The [dial-out telemetry server](https://gnmic.openconfig.net/cmd/listen/) is provided for Nokia SR OS.
* **Pre-built multi-platform binaries**  
  Statically linked [binaries](https://github.com/openconfig/gnmic/releases) made in our release pipeline are available for major operating systems and architectures. Making [installation](https://gnmic.openconfig.net/install/) a breeze!
* **Extensive and friendly documentation**  
  You won't be in need to dive into the source code to understand how `gnmic` works, our [documentation site](https://gnmic.openconfig.net) has you covered.

## Quick start guide

### Installation

```
bash -c "$(curl -sL https://get-gnmic.openconfig.net)"
```

### Capabilities request

```
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure capabilities
```

### Get request

```
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      get --path /state/system/platform
```

### Set request

```
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      set --update-path /configure/system/name \
          --update-value gnmic_demo
```

### Subscribe request

```
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      sub --path "/state/port[port-id=1/1/c1/1]/statistics/in-packets"
```

### Prompt mode

The [prompt mode](https://gnmic.openconfig.net/user_guide/prompt_suggestions/) is an interactive mode of the gnmic CLI client for user convenience.

```bash
# clone repository with YANG models (Openconfig example)
git clone https://github.com/openconfig/public
cd public

# Start gnmic in prompt mode and read in all the modules:

gnmic --file release/models \
      --dir third_party \
      --exclude ietf-interfaces \
      prompt
```


================================================
FILE: cmd/demo/getresponse.textproto
================================================
notification: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ssh-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "protocol-version"
      }
    }
    val: {
      string_val: "V2"
    }
  }
}
notification: {
  timestamp: 1676420328291197426
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}
notification: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ntp"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enabled"
      }
    }
    val: {
      bool_val: false
    }
  }
}
notification: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ntp"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable-ntp-auth"
      }
    }
    val: {
      bool_val: false
    }
  }
}
notification: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ssh-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable"
      }
    }
    val: {
      bool_val: true
    }
  }
}
notification: {
  timestamp: 1676420328448197153
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}
notification: {
  timestamp: 1676419100459254468
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "boot-time"
      }
    }
    val: {
      uint_val: 1676419100459308639
    }
  }
}
notification: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "telnet-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable"
      }
    }
    val: {
      bool_val: false
    }
  }
}
notification: {
  timestamp: 1676422427135895887
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesareredd"
    }
  }
}
notification: {
  timestamp: 1676422427269965151
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesareredd"
    }
  }
}
notification: {
  timestamp: 1676422434342310772
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}
notification: {
  timestamp: 1676422434479082363
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}


================================================
FILE: cmd/demo/setrequest.textproto
================================================
replace {
  path {
    elem {
      name: "system"
    }
    elem {
      name: "config"
    }
    elem {
      name: "hostname"
    }
  }
  val {
    string_val: "violetsareblue"
  }
}
replace {
  path {
    elem {
      name: "lacp"
    }
    elem {
      name: "interfaces"
    }
    elem {
      name: "interface"
      key {
        key: "name"
        value: "Port-Channel9"
      }
    }
  }
  val {
    json_ietf_val: "{\n  \"openconfig-lacp:config\": {\n    \"interval\": \"FAST\",\n    \"name\": \"Port-Channel9\"\n  },\n  \"openconfig-lacp:name\": \"Port-Channel9\"\n}"
  }
}
update {
  path {
    elem {
      name: "network-instances"
    }
    elem {
      name: "network-instance"
      key {
        key: "name"
        value: "VrfBlue"
      }
    }
  }
  val {
    json_ietf_val: "{\n  \"openconfig-network-instance:config\": {\n    \"name\": \"VrfBlue\",\n    \"type\": \"openconfig-network-instance-types:L3VRF\"\n  },\n  \"openconfig-network-instance:name\": \"VrfBlue\"\n}"
  }
}


================================================
FILE: cmd/demo/setrequest2.textproto
================================================
replace {
  path {
    elem {
      name: "system"
    }
    elem {
      name: "config"
    }
    elem {
      name: "hostname"
    }
  }
  val {
    string_val: "rosesarered"
  }
}
replace {
  path {
    elem {
      name: "lacp"
    }
    elem {
      name: "interfaces"
    }
    elem {
      name: "interface"
      key {
        key: "name"
        value: "Port-Channel9"
      }
    }
  }
  val {
    json_ietf_val: "{\n  \"openconfig-lacp:config\": {\n    \"interval\": \"FAST\",\n    \"name\": \"Port-Channel9\"\n  },\n  \"openconfig-lacp:name\": \"Port-Channel9\"\n}"
  }
}
replace {
  path {
    elem {
      name: "network-instances"
    }
    elem {
      name: "network-instance"
      key {
        key: "name"
        value: "VrfBlue"
      }
    }
  }
  val {
    json_ietf_val: "{\n  \"openconfig-network-instance:config\": {\n    \"name\": \"VrfBlue\",\n    \"type\": \"openconfig-network-instance-types:L3VRF\"\n  },\n  \"openconfig-network-instance:name\": \"VrfBlue\"\n}"
  }
}


================================================
FILE: cmd/demo/subscriberesponses.textproto
================================================
sync_response: true

update: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ssh-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "protocol-version"
      }
    }
    val: {
      string_val: "V2"
    }
  }
}

update: {
  timestamp: 1676420328291197426
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}

update: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ntp"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enabled"
      }
    }
    val: {
      bool_val: false
    }
  }
}

update: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ntp"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable-ntp-auth"
      }
    }
    val: {
      bool_val: false
    }
  }
}

update: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "ssh-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable"
      }
    }
    val: {
      bool_val: true
    }
  }
}

update: {
  timestamp: 1676420328448197153
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}

update: {
  timestamp: 1676419100459254468
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "boot-time"
      }
    }
    val: {
      uint_val: 1676419100459308639
    }
  }
}

update: {
  timestamp: 1676419100456944135
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "telnet-server"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "enable"
      }
    }
    val: {
      bool_val: false
    }
  }
}

update: {
  timestamp: 1676422427135895887
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesareredd"
    }
  }
}

update: {
  timestamp: 1676422427269965151
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesareredd"
    }
  }
}

update: {
  timestamp: 1676422434342310772
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "config"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}

update: {
  timestamp: 1676422434479082363
  prefix: {
    origin: "openconfig"
    target: "fakedut"
  }
  update: {
    path: {
      elem: {
        name: "system"
      }
      elem: {
        name: "state"
      }
      elem: {
        name: "hostname"
      }
    }
    val: {
      string_val: "rosesarered"
    }
  }
}


================================================
FILE: config.json
================================================
{
    "username": "admin",
    "password": "sros",
    "port": 57400,
    "timeout": "5s",
    "skip-verify": true,
    "tls-key": "/path/to/client.key",
    "tls-cert": "/path/to/client.crt",
    "tls-ca": "/path/to/ca.crt",
    "targets": {
        "172.17.0.100": {
            "timeout": "2s",
            "subscriptions": [
                "sub1"
            ],
            "outputs": [
                "output1",
                "output3"
            ]
        },
        "172.17.0.101": {
            "username": "sros",
            "password": "sros",
            "insecure": true,
            "subscriptions": [
                "sub2"
            ],
            "outputs": [
                "output2",
                "output3"
            ]
        },
        "172.17.0.102:57000": {
            "password": "sros123",
            "tls-key": "/path/file1",
            "tls-cert": "/path/file2"
        },
        "172.17.0.103": null
    },
    "subscriptions": {
        "sub1": {
            "paths": [
                "/configure/port[port-id=*]",
                "/state/port[port-id=*]"
            ],
            "stream-mode": "on_change"
        },
        "sub2": {
            "paths": [
                "/configure/port[port-id=*]/statistics"
            ],
            "stream-mode": "sample",
            "sample-interval": "10s"
        }
    },
    "outputs": {
        "output1": {
            "type": "file",
            "file-type": "stdout"
        },
        "output2": {
            "type": "file",
            "filename": "local.log"
        },
        "output3": {
            "type": "nats",
            "address": "localhost:4222",
            "subject-prefix": "telemetry",
            "username": null,
            "password": null
        },
        "output4": {
            "type": "stan",
            "address": "localhost:4223",
            "subject": "telemetry",
            "username": null,
            "password": null,
            "name": null,
            "cluster-name": "test-cluster",
            "timeout": null,
            "ping-interval": null,
            "ping-retry": null
        },
        "output5": {
            "type": "kafka",
            "address": "localhost:9092",
            "topic": "telemetry",
            "max-retry": null,
            "timeout": null
        },
        "output6": {
            "type": "nats",
            "address": "localhost:4222",
            "subject-prefix": "telemetry",
            "username": null,
            "password": null
        }
    }
}

================================================
FILE: config.toml
================================================
username = "admin"
password = "sros"
port = 57400
timeout = "5s"
skip-verify = true
tls-key = "/path/to/client.key"
tls-cert = "/path/to/client.crt"
tls-ca = "/path/to/ca.crt"

[targets]
  [targets."172.17.0.100"]
  timeout = "2s"
  subscriptions = [ "sub1" ]
  outputs = [ 
    "output1", 
    "output3"
    ]

  [targets."172.17.0.101"]
  username = "sros"
  password = "sros"
  insecure = true
  subscriptions = [ "sub2" ]
  outputs = [ 
    "output2", 
    "output3" 
    ]

  [targets."172.17.0.102:57000"]
  password = "sros123"
  tls-key = "/path/file1"
  tls-cert = "/path/file2"

[subscriptions.sub1]
paths = [ 
  "/configure/port[port-id=*]", 
  "/state/port[port-id=*]" 
  ]
stream-mode = "on_change"

[subscriptions.sub2]
paths = [ "/configure/port[port-id=*]/statistics" ]
stream-mode = "sample"
sample-interval = "10s"

[outputs.output1]
type = "file"
file-type = "stdout"

[outputs.output2]
type = "file"
filename = "local.log"

[outputs.output3]
type = "nats"
address = "localhost:4222"
subject-prefix = "telemetry"

[outputs.output4]
type = "stan"
address = "localhost:4223"
subject = "telemetry"
cluster-name = "test-cluster"

[outputs.output5]
type = "kafka"
address = "localhost:9092"
topic = "telemetry"

[outputs.output6]
type = "nats"
address = "localhost:4222"
subject-prefix = "telemetry"


================================================
FILE: config.yaml
================================================
# © 2022 Nokia.
#
# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and Corporate Contributor License Agreement (“CLA”) and governed by the Apache License 2.0.
# No other rights or licenses in or to any of Nokia’s intellectual property are granted for any other purpose.
# This code is provided on an “as is” basis without any warranties of any kind.
#
# SPDX-License-Identifier: Apache-2.0

username: admin
password: sros
port: 57400
timeout: 5s
skip-verify: true
tls-key: /path/to/client.key
tls-cert: /path/to/client.crt
tls-ca: /path/to/ca.crt

targets:
  172.17.0.100:
    timeout: 2s
    subscriptions:
      - sub1
    outputs:
      - output1
      - output3
  172.17.0.101:
    username: sros
    password: sros
    insecure: true
    subscriptions:
      - sub2
    outputs:
      - output2
      - output3
  172.17.0.102:57000:
    password: sros123
    tls-key: /path/file1
    tls-cert: /path/file2
  172.17.0.103:
    
subscriptions:
  sub1:
    paths:
      - /configure/port[port-id=*]
      - /state/port[port-id=*]
    stream-mode: on_change # target-defined # sample
  sub2:
    paths:
       - /configure/port[port-id=*]/statistics
    stream-mode: sample
    sample-interval: 10s

outputs:
  output1:
    type: file
    file-type: stdout
  output2:
    type: file
    filename: local.log
  output3:
    type: nats
    address: localhost:4222
    subject-prefix: telemetry
    username:
    password:
  output4:
    type: stan
    address: localhost:4223
    subject: telemetry
    username:
    password:
    name: 
    cluster-name: test-cluster
    timeout:
    ping-interval:
    ping-retry:
  output5:
    type: kafka
    address: localhost:9092
    topic: telemetry
    max-retry: 
    timeout:
  output6:
    type: nats
    address: localhost:4222
    subject-prefix: telemetry
    username:
    password:


================================================
FILE: docs/CNAME
================================================
gnmic.openconfig.net

================================================
FILE: docs/basic_usage.md
================================================
The following examples demonstrate the basic usage of `gnmic` in a scenario where the remote target runs an unsecured (without TLS enabled) gNMI server. The `admin:admin` credentials are used to connect to the gNMI server running at `10.1.0.11:57400` address.

!!!info
    For the complete command usage examples, refer to the ["Command reference"](cmd/capabilities.md) menu.

### Capabilities RPC

Getting the device's [capabilities](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#32-capability-discovery) is done with [`capabilities`](cmd/capabilities.md) command:

```bash
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure capabilities
gNMI_Version: 0.7.0
supported models:
  - nokia-conf, Nokia, 19.10.R2
  - nokia-state, Nokia, 19.10.R2
  - nokia-li-state, Nokia, 19.10.R2
  - nokia-li-conf, Nokia, 19.10.R2
<< SNIPPED >>
supported encodings:
  - JSON
  - BYTES
```

### Get RPC

[Retrieving](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#33-retrieving-snapshots-of-state-information) the data snapshot from the target device is done with [`get`](cmd/get.md) command:

```bash
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      get --path /state/system/platform

{
  "source": "10.1.0.11:57400",
  "timestamp": 1592829586901061761,
  "time": "2020-06-22T14:39:46.901061761+02:00",
  "updates": [
    {
      "Path": "state/system/platform",
      "values": {
        "state/system/platform": "7750 SR-1s"
      }
    }
  ]
}
```

### Set RPC

[Modifying](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#34-modifying-state) state of the target device is done with [`set`](cmd/set.md) command:

```bash
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      set --update-path /configure/system/name \
          --update-value gnmic_demo

{
  "source": "0.tcp.eu.ngrok.io:12267",
  "timestamp": 1592831593821038738,
  "time": "2020-06-22T15:13:13.821038738+02:00",
  "results": [
    {
      "operation": "UPDATE",
      "path": "configure/system/name"
    }
  ]
}
```

### Subscribe RPC

[Subscription](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#35-subscribing-to-telemetry-updates) to the gNMI telemetry data can be done with [`subscribe`](cmd/subscribe.md) command:

```bash
gnmic -a 10.1.0.11:57400 -u admin -p admin --insecure \
      sub --path "/state/port[port-id=1/1/c1/1]/statistics/in-packets"

{
  "source": "0.tcp.eu.ngrok.io:12267",
  "timestamp": 1592832965197288856,
  "time": "2020-06-22T15:36:05.197288856+02:00",
  "prefix": "state/port[port-id=1/1/c1/1]/statistics",
  "updates": [
    {
      "Path": "in-packets",
      "values": {
        "in-packets": "12142"
      }
    }
  ]
}
```

### YANG path browser

`gnmic` can produce a list of XPATH/gNMI paths for a given YANG model with its [`path`](cmd/path.md) command. The paths in that list can be used as the `--path` values for the Get/Set/Subscribe commands.

```bash
# nokia model
gnmic path -m nokia-state --file nokia-state-combined.yang | head -10
/state/aaa/radius/statistics/coa/dropped/bad-authentication
/state/aaa/radius/statistics/coa/dropped/missing-auth-policy
/state/aaa/radius/statistics/coa/dropped/invalid
/state/aaa/radius/statistics/coa/dropped/missing-resource
/state/aaa/radius/statistics/coa/received
/state/aaa/radius/statistics/coa/accepted
/state/aaa/radius/statistics/coa/rejected
/state/aaa/radius/statistics/disconnect-messages/dropped/bad-authentication
/state/aaa/radius/statistics/disconnect-messages/dropped/missing-auth-policy
/state/aaa/radius/statistics/disconnect-messages/dropped/invalid
```


================================================
FILE: docs/blog/index.md
================================================
Coming soon

================================================
FILE: docs/changelog.md
================================================
## Changelog

### v0.45.0 - March 2nd 2026

- Prometheus and Prometheus RemoteWrite outputs:

    - When converting values to labels, duplicate label names are now resolved by prepending parent path elements until uniqueness is achieved, preventing metrics from being dropped.

- Get/Set commands:

    - Custom gNMI extensions can be included in requests via `--registered-extensions` and a JSON payload; use `--proto-dir` and `--proto-file` to specify the extension Protobuf definitions.

- Formatters:

    - JSON output no longer escapes HTML characters (`<`, `>`, `&`), producing more readable output for values such as path prefixes containing `->`.

- Outputs:

    - OTLP: Implemented dynamic config via `Update()` and `UpdateProcessor()`, configurable Resource vs DataPoint level attributes, support for multiple metrics per gNMI message, and include gNMIc version in OTLP resource scope.

- Target:

    - Target last error is now reflected in a consistent way across collector state and API responses.

- gNMI API:

    - Improved error formatting and added tests for the `pkg/api` package.

- Performance:

    - Pool bytes buffers and strings builders where it makes sense to reduce allocations.

- Dependencies:

    - Bumped `github.com/cloudflare/circl` from 1.6.1 to 1.6.3.
    - Bumped `github.com/go-git/go-git/v5` from 5.13.0 to 5.16.5.
    - Bumped `go.opentelemetry.io/otel/sdk` from 1.38.0 to 1.40.0.

### v0.44.0 - February 17th 2026

- gNMI Extensions:

    - gNMI extensions in get, set, and subscribe responses are now parsed and displayed as JSON when using `--proto-dir`, `--proto-file`, and `--registered-extensions` with the corresponding Protobuf files.

- Collector mode:

    - Collector mode now stores Targets state (gNMI connection and subscription(s) state) in a separate store.

    - Collector mode supports an SSE endpoint streaming config and state for any object (Target, subscription, outputs, etc.)

- Target:

    - Multiple gRPC level config knobs can now be set per target: gRPC read/write buffer, gRPC window size, and other dial options. Configuration is documented in the target configuration reference.

### v0.43.0 - February 1st 2026

- Inputs:

    - Jetstream:
      - Added support for configuring `max-ack-pending` to limit the maximum number of unacknowledged messages on a NATS JetStream input.
      - DeliverPolicy and AckPolicy are now fully configurable for greater flexibility and control.
      - Added NATS JetStream workqueue retention pattern support for exactly-once message processing in task distribution scenarios.

- Outputs:

    - Jetstream:
      - Added `retention-policy` configuration option with support for `limits` (default) and `workqueue` retention policies.
      - Stream existence verification with detailed logging; omit `create-stream` to use existing streams.

    - Introduced support for OpenTelemetry Protocol (OTLP) as an output destination, enabling direct export of telemetry data to OTLP-compatible backends with full metric conversion (gauges, counters, histograms) and custom resource attributes.

- Commands:

    - Added the new `collector` command: Runs gNMIc in collector mode, enabling dynamic, live updates to all configuration objects including targets, subscriptions, outputs, inputs, and processors. Unlike the `subscribe` command, the `collector` command supports on-the-fly configuration changes via the REST API, without requiring a restart. gNMIc automatically reconciles changes to maintain the desired state.

    - The `collector` command also includes a suite of subcommands, allowing you to configure the gNMIc collector directly from the CLI.

- Formatters:

    - Flat format: Fixed leading slash handling when origin is not included in prefix or prefix is non-existent, ensuring consistent path formatting across all notification types.

- Processors:

    - `event_group_by` processor now correctly handles delete events.

- API:

    - Fixed the API path to patch subscriptions for a target ID.

- Target:

    - When a target is removed, it is now also removed from the configuration.

- Dependencies:

    - Fixed `gnmic/pkg/api` module version mismatch in go.mod for consumers building gNMIc as a dependency.
    - Bumped `golang.org/x/crypto` to v0.45.0.

### v0.42.0 - September 19th 2025

- Inputs:

    - Add support for NATS Jetstream input type.

    - Kafka: Fixed event parsing when `eventMsg` was not initialized, preventing nil pointer dereference.

- Loader:

    - Loaded targets subscribe requests are now subject to the `subscribe-backoff` timer when new targets are added via loaders (HTTP, file, etc.) or config change events.

    - Loaded target configuration now supports environment variable expansion when `expand-env` is set to true, enabling per-target credentials via env vars.

    - Consul loader: Fixed tag matching logic to allow services with extra metadata tags (subset matching); services with required tags plus additional tags are no longer incorrectly rejected.

    - Consul loader: Improved Go template parsing for target name and event-tags.

    - HTTP loader: Various fixes and added tests (fixes #712).

- Outputs:

    - Kafka: Fixed missing label in error metric that could cause panics when error reason was unavailable.

- gNMI server:

    - The unary RPCs timeout is now configurable via `gnmi-server.timeout` in the config (default remains 2 minutes).

- Get command:

    - Added optional organization and version for model selection: prepend `/` for organization, append `:` for version when specifying models.

- Subscribe:

    - Fixed `sync_response` output being suppressed for ONCE mode subscriptions; behavior now matches STREAM mode.

- Targets:

    - A new internal Prometheus metric `gnmic_target_connection_state` reflects the gRPC client connection state with values: 0 (UNKNOWN), 1 (IDLE), 2 (CONNECTING), 3 (READY), 4 (TRANSIENT_FAILURE), or 5 (SHUTDOWN). The `target_up` metric now correctly reflects connection failures (e.g., auth issues).

- Bug fixes:

    - Fixed memory leak when subscription fails: `cancel()` reference was kept alive indefinitely.

    - Fixed OS environment variable values being incorrectly lowercased (fixes #663).

- API:

    - Documentation updated for `POST /api/v1/config/targets` to reflect that the `name` field is required for proper target identification.

- Dependencies:

    - Bumped `golang.org/x/crypto` to v0.41.0.
    - Bumped `golang.org/x/oauth2` to v0.31.0.

### v0.41.0 - April 6th 2025

- Processors:

    - Added `event-time-epoch` processor, enabling converting string-based time values into epoch timestamps.

    - Fixed `ieeefloat32` processor for correct handling of binary IEEE float32 values.

- Target Discovery:

    - Consul loader: Adds the ability to use Go Templates on Consul targets to set target name as well as event-tags (e.g., `target-name`, `target-tags` with `{{.Meta.*}}`).

- Loader:

    - When a target configuration changes, loaders now generate delete and add actions so the subscription is restarted to apply the new parameters (fixes #563).

- Outputs:

    - Messages are now exported to outputs in sequence to avoid sync responses being sent before initial notifications (fixes #612).

    - Output internal metrics are now registered only once, preventing duplicate registration errors (fixes #586).

- Path generation:

    - Fixed xpath generation with prefix: module prefix is now replaced with module name when generating xpaths (fixes #633).

- Targets:

    - `target_up` metric now resets before creating metrics so deleted targets (e.g., via Consul) no longer show as still up (fixes #604).

- Dependencies:

    - Bumped `github.com/golang/glog` to v1.2.4.

### v0.40.0 - January 27th 2025

- Processors:

    - Introducing `event-value-tag-v2` processor, enabling the addition of values as tags to other messages
      without requiring caching to be enabled in the associated output.
  
- Logging related to calls to the `/api/v1/healthz` API endpoint is now optional.

- Clustering:
  
    - New REST API endpoints added:
      - Switch the cluster leader: `DELETE /api/v1/cluster/leader`
      - Drain an instance: `POST /api/v1/members/{id}/drain` where id is the instance name to be drained
      - Rebalance the load between instances: `POST /api/v1/cluster/rebalance`

### v0.39.0 - November 7th 2024

- Get Command

    - Added `--dry-run` flag.

- Set Command

    - Added `--no-trim` flag to disable trimming white spaces from values payload.

- REST API

    - Added `/api/v1/admin/shutdown` endpoint to shutdown gNMIc.

- Outputs:

    - File: file output now supports file rotation.

    - NATS and Jetstream: The publishers buffer size is now configurable.

- Build:

    - Added `ARM64` binary and container image.

- gNMIc Metrics:

    - Added a metric to keep track of failed subscribe requests.

    - Added a metric to keep track of targets connectivity state.

- Clustering:

    - The REST API client used for building gNMIc cluster can now be configured with client certificates to support mTLS.

- Processors:

    - Added a processor to handle converting binary IEEE float32 values to float32.


### v0.38.0 - July 8th 2024

- Kafka Output

    - Add configurable Kafka version

- gNMI extensions

    - Implement [Commit confirmed gNMI extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-commit-confirmed.md)
    - Implement [Depth gNMI extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-depth.md)

### v0.37.0 - May 13th 2024

- gNMI connection TCP Keepalive

    - It is now possible to configure the TCP keepalive probes time interval.

- gRPC Keepalive

    - The gRPC connection keepalive parameters are now configurable.
    It follows the gRPC spec: https://github.com/grpc/proposal/blob/master/A8-client-side-keepalive.md

- Proxy Command:

    - gNMIc now supports a `proxy` command.
    When issued, gNMIc runs as a gNMI proxy. See details [here](cmd/proxy.md)

- Processor Command:

    - gNMIc now supports a `processor` command.
    It can be used to run a set of processor offline against an input of event messages and print the result.
    See details [here](cmd/processor.md)

- Kafka Output:

    - The Kafka output now supports a configurable flush-interval parameters.

- InfluxDB Output:

    - The InfluxDB output now supports writing gNMI deletes to InfluxDB using a custom tag name.

- Prometheus Output:

    - The Prometheus output will now automatically convert boolean values (true: 1 and false: 0).


### v0.36.0 - February 13th 2024

- Event Message

    - gNMI updates with deleted paths are now converted into separate event messages where the keys are extracted from the path and set as event tags.

- gNMI TLS cipher suites

    - It is now possible to select the list of a cipher suites that gNMIc advertises to a gNMI server during a TLS handshake. The full list of supported ciphers can be found [here](user_guide/targets/targets.md#controlling-the-advertised-cipher-suites)

- Set Request

    - The Set command now features a new flag, `--proto-file`, which allows the specification of one or more files. These files should contain gNMI Set requests in `prototext` format, which will be sent to the specified targets.

### v0.35.0 - January 20th 2024

- Processors

    - Added a plugin process type that allows users to write their own custom processors: [examples](https://github.com/openconfig/gnmic/tree/main/examples/plugins)

- gRPC metadata

    - A new flag `--metadata | -H` is introduced. It allows users to add custom gRPC metadata headers to any request.


- Outputs:

    - Kafka output:
        - Added support for custom topics per target/subscription.

        - Added support for both Async and Sync Kafka producers.

- Commands:

    - Listen command:
        When using the `listen` command outputs internal metrics are properly initialized and exposed to prometheus for scraping.

### v0.34.0 - November 11th 2023

- Prometheus Write Output

    - The number of `prometheus_write` writers can now be configured.

- Subscription Encoding

    - A subscription encoding can now be set per target. Before, it was either a global attribute or set per subscription.
        With this change, it can be set globally, per target or per subscription.

- Processors:

    - New `event-combine` processor: A convenience processor that allows combining other processors into a single one.

    - New `event-rate-limit` processor: A processor that rate-limits each event with matching tags to the configured amount per-seconds.

- Outputs:

    - New `asciigraph` output: https://asciinema.org/a/617477

- Clustering:

    - New `redis` locker: For leader election, service discovery and target distribution gNMIc supports both `Consul` and `Kubernetes`. It is now possible to use `redis` for the same purpose.

### v0.33.0 - October 8th 2023

- Rest API

    - Added a kubernetes friendly `api/v1/healthz` endpoint.

- Set Command

    - Added support for gNMI set [`union_replace`](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-union_replace.md) operation.

- Outputs

    - Allow the number of workers used by the `prometheus` and `prometheus_write` outputs to be configurable to improve performance.

- Go version

    - Upgrade to Golang v1.21.1.

### v0.32.0 - August 31st 2023

- TLS

    - It is now possible to override the serverName used by gNMIc when verifying the server name present in the
      certificate sent by the gNMI server. [PR](https://github.com/openconfig/gnmic/pull/173)

- Subscription
 
    - Added support for mixing on-change and sample stream subscription in the same gRPC stream. [PR](https://github.com/openconfig/gnmic/pull/197)
    - Added support for attaching specific outputs to a subscription. [PR](https://github.com/openconfig/gnmic/pull/209)

- REST API

    - Added a health chek endpoint to be used by kubernetes. [PR](https://github.com/openconfig/gnmic/pull/202)

- Kafka Output

    - Added support for Kafka compression. [PR](https://github.com/openconfig/gnmic/pull/203)

- Generate Path
 
    - Added `enum-values` to the `JSON` output of `generate path` command. [PR](https://github.com/openconfig/gnmic/pull/215)

### v0.31.0 - May 17th 2023

- Prometheus output

    - When using the Consul auto discovery feature of the Proemtheus output,
      it is now possible to configure different service and listen addresses.
      This is useful when gNMIc is running as a container of behind a NAT device

- Set Request file

    - The CLI origin is now allowed in the `path` field of `updates`, `replaces` and `deletes` in a set request file.
      If the `path` field has the `cli:/` origin, the `value` field is expected to be a string and will be set in an `ascii` TypedValue.

### v0.30.0 - April 18th 2023

- Set Command

    - The [set command](cmd/set.md) now supports the flags `--replace-cli`, `--replace-cli-file`, `--update-cli` and `--update-cli-file`, these flags can be used to send gNMI set requests with the CLI origin.

- Logging:
  
    - Reduce log verbosity of File and HTTP target discovery mechanisms.

- Processors:

    - The [Drop](user_guide/event_processors/event_drop.md) event processor completely removes the message to be dropped instead of replacing it with an empty message.

- Inputs:

    - [Kafka input](user_guide/inputs/kafka_input.md) now supports TLS connections.

- Outputs:

    - [Kafka output](user_guide/outputs/kafka_output.md) now has a configuration attribute called `insert-key`, if true, the messages written will include a key built from the gNMI message source and subscription name.

    - [TCP output](user_guide/outputs/tcp_output.md) now has a configuration attribute called `delimiter`, it allows to set user defined string to be sent between each message. This allows the receiving end to properly split JSON objects. It it particularly useful with Logstash when writing gNMI events to an ELK stack.

- TLS:

    - When using `gNMIc`'s components that expose a TLS server (gNMI server, Tunnel server, Rest API and Prometheus output) it's possible to fine tune the how the server requests and validates a client certificate.

        This is done using the configuration attribute `client-auth` under each server's TLS section, it takes 4 different values:

        - request:
            The server requests a certificate from the client but does not require the client to send a certificate.
            If the client sends a certificate, it is not required to be valid.

        - require:
            The server requires the client to send a certificate and does not fail if the client certificate is not valid.

        - verify-if-given:
            The server requests a certificate, does not fail if no certificate is sent. If a certificate is sent it is required to be valid.

        - require-verify:
            The server requires the client to send a valid certificate.

- Diff Command:

    - The [diff command](cmd/diff/diff.md) has 2 new sub commands:

        - [`setrequest`](cmd/diff/diff_setrequest.md): compares the intent between two `SetRequest` messages encoded in textproto format.

        - [`set-to-notifs`](cmd/diff/diff_set_to_notifs.md): verifies whether a set of
            notifications from a `GetResponse` or a stream of `SubscribeResponse` messages
            comply with a `SetRequest` messages in textproto format. The envisioned use case
            is to check whether a stored snapshot of device state matches that of the
            intended state as specified by a `SetRequest`.

- Outputs:

    - When using the `event` format with certain outputs (`file`, `nats`, `jetstream`, `kafka`, `tcp` or `udp`) it's possible to send event message individually as opposed to sending them in an array.
        This is done using the attribute `split-events: true` under each of the outputs configuration sections.

    - [Prometheus output](user_guide/outputs/prometheus_output.md) now supports a custom service address field under `service-registration`, it specifies the address to be registered in Consul for discovery.
        It can be a hostname, an IP address or a IP/Host:Port socket address. It it does not contain a port number, the port number from the `listen` field is used.

- Set Request file

    - The Set request file can be used with Origin `cli`, gNMIc will properly format the commands as string, not as JSON value.

### v0.29.0 - February 20th 2023

- Generate Path

    - The `generate path` command with the flag `--json` shows the features the path depends on.
      The list of features is built recursively from the YANG attribute `if-feature`.

- Processors:

    - New processor [`event-starlark`](user_guide/event_processors/event_starlark.md) allows to run a [starlak](https://github.com/google/starlark-go/blob/master/doc/spec.md) script on the received messages.

- Loaders

    - The [HTTP loader](user_guide/targets/target_discovery/http_discovery.md) now supports different authentication schemas as well as setting a template from a local file.

### v0.28.0 - December 7th 2022

- Targets

    - Targets static tags are now properly propagated to outputs when a cache is used.

- Listen Command:

    - The `system-name` HTTP2 header is now used as a tag in exported metrics.

- Outputs:

    - The timestamp precision under `gNMIc`'s InfluxDB output is now configurable.

    - Added a new `snmp` output type, it allows to dynamically convert gNMI updates into SNMP traps.

### v0.27.0 - October 8th 2022

- Targets

    - Add supports for socks5 proxies per target.

- Logging

    - Support for log rotation via the flags `--log-max-size`, `log-max-backups` and `--log-compress`

### v0.26.0 - June 28th 2022

- Outputs

    - Add [Prometheus Remote Write output](user_guide/outputs/prometheus_write_output.md), this output type can be used to push metrics to various systems like [Mimir](https://grafana.com/oss/mimir/), [CortexMetrics](https://cortexmetrics.io/), [VictoriaMetrics](https://victoriametrics.com/), [Thanos](https://thanos.io/)...
    - Add [NATS Jetstream output](user_guide/outputs/jetstream_output.md), it allows to write metrics to NATS jetstream which supports persistency and filtering.

- [gNMI historical subscriptions](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md#1-purpose)

    `gNMIc` now support historical subscription using the [gNMI history extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md#2-definition)

### v0.25.1 - June 13th 2022

- Upgrade Go version to go1.18.1.

- Fix running `gnmic subscribe` with only Inputs and Outputs configured (no subscriptions or targets).

### v0.25.0 - June 11th 2022

- Processors

    - [Strings replace processor](user_guide/event_processors/event_strings.md) supports replaces using regular expressions.

    - Processors  are now supported when collecting telemetry using [listen command](cmd/listen.md) (Nokia SROS specific)

- New Processors

    - [Data convert](user_guide/event_processors/event_data_convert.md)

    - [Duration convert](user_guide/event_processors/event_duration_convert.md)
    
    - [Value tag](user_guide/event_processors/event_value_tag.md)

- [Clustering](user_guide/HA.md)

    - `gNMIc` supports kubernetes based clustering,
    i.e you can build `gNMIc` clusters on kubernetes without the need for Consul cluster.

- [Yang path generation](cmd/generate.md)

    - The command `gnmic generate path` supports generating paths for YANG containers.
    In earlier versions, the paths generation was done for YANG leaves only.

- Internal gNMIc Prometheus metrics

    `gNMIc` exposes additional internal metrics available to be scraped using Prometheus.

- Static tags from target configuration

    - It is now possible to set static tags on events by configuring them under each target.

- Influxdb cache

    The [InfluxDB output](user_guide/outputs/influxdb_output.md) now supports gNMI based caching, allowing to apply processors on multiple event messages at once and batching the written points to InfluxDB.

### v0.24.0 - March 13th 2022

- [gRPC Tunnel Support](user_guide/tunnel_server.md)

    Add support for gNMI RPC using a gRPC tunnel, gNMIc runs as a collector with an embedded tunnel server.

### v0.23.0 - February 24th 2022

- Docker image:

    - The published `gnmic` docker image is now based on `alpine` instead of an empty container.
    - A `from scratch` image is published and can be obtained using the command:
     ```bash
     docker pull ghcr.io/karimra/gnmic:latest-scratch
     docker pull ghcr.io/karimra/gnmic:v0.23.0-scratch
     ```

- [gNMIc Golang API](user_guide/golang_package/intro.md):

    - Add gNMI responses constructors
    - Add gRPC tunnel proto messages constructors

- [Target Discovery](user_guide/targets/target_discovery/discovery_intro.md):

    - Add the option to transform the loaded targets format using a Go text template for file and HTTP loaders
    - Poll based target loaders (file, HTTP and docker) now support a startup delay timer

### v0.22.1 - February 2nd 2022

- Fix a Prometheus output issue when using gNMI cache that causes events to be missing from the metrics.

### v0.22.0 - February 1st 2022

- [gNMIc Golang API](user_guide/golang_package/intro.md):

    Added the `github.com/karimra/gnmic/api` golang package.
    It can be imported by other Golang programs to ease the creation of gNMI targets and gNMI Requests.

### v0.21.0 - January 23rd 2022

- [Generate Cmd](cmd/generate/generate_path.md):

    Add YANG module namespace to generated paths.

- Outputs:

    Outputs [File](user_guide/outputs/file_output.md), [NATS](user_guide/outputs/nats_output.md) and [Kafka](user_guide/outputs/kafka_output.md) now support a `msg-template` field to customize the written messages using Go templates.

- API:

    Add [Cluster API](user_guide/api/cluster.md) endpoints.

- Actions:

    Add [Template](user_guide/actions/actions.md#template-action) action.

    Add Subscribe ONCE RPC to [gNMI](user_guide/actions/actions.md#gnmi-action) action.

    Allow [gNMI](user_guide/actions/actions.md#gnmi-action) action on multiple targets.

    Add [Script](user_guide/actions/actions.md#script-action) action.

- [Get Cmd](cmd/get.md):

    Implement Format `event` for GetResponse messages.

    Add the ability to execute processors with Get command flag [`--processor`](cmd/get.md#processor) on GetResponse messages.

- [Target Discovery](user_guide/targets/target_discovery/discovery_intro.md):

    Add the ability to run [actions](user_guide/actions/actions.md) on target discovery or deletion.

- [Set Cmd](cmd/set.md):

    Add [`--dry-run`](cmd/set.md#dry-run) flag which runs the set request templates and prints their output without sending the SetRequest to the targets.

- TLS:

    Add pre-master key logging for TLS connections using the flag [`--log-tls-secret`](global_flags.md#log-tls-secret). The key can be used to decrypt encrypted gNMI messages using wireshark.

- Target:

    Add `target.Stop()` method to gracefully close the target underlying gRPC connection.

### v0.20.0 - October 19th 2021

- Add [gomplate](https://docs.gomplate.ca) template functions to all templates rendered by `gnmic`.

- [Path generation](cmd/generate/generate_path.md):

    `gnmic generate path` supports generating paths with type and description in JSON format.

- [Set RPC template](cmd/set.md#templated-set-request-file):

    Set RPC supports multiple template files in a single command.

- [Clustering](user_guide/HA.md):

    `gnmic` clusters can be formed using secure (HTTPS) API endpoints.

- [Configuration payload generation](cmd/generate.md):

    Configuration keys can now be formatted as `camelCase` or `snake_case` strings

### v0.19.1 - October 7th 2021

- Path search
  
  Do not enter search mode if not paths are found.

- [Prometheus Output](user_guide/outputs/prometheus_output.md)

  Change the default service name when registering with a Consul server

### v0.19.0 - September 16th 2021

- Event Processors

    [Event Convert](user_guide/event_processors/event_convert.md) now converts binary float notation to float

- Target Loaders:

    - [HTTP Loader](user_guide/targets/target_discovery/http_discovery.md)

      gNMIc can now dynamically discover targets from a remote HTTP server.

      HTTP Loader is now properly instrumented using Prometheus metrics.

    - [File Loader](user_guide/targets/target_discovery/file_discovery.md)

      Supports remote files (ftp, sftp, http(s)) in addition to local file system files.

      File loader is now properly instrumented using Prometheus metrics.

    - [Consul Loader](user_guide/targets/target_discovery/consul_discovery.md)

      Consul Loader is now properly instrumented using Prometheus metrics.

    - [Docker Loader](user_guide/targets/target_discovery/docker_discovery.md)

      Docker Loader is now properly instrumented using Prometheus metrics.

- gRPC

     gNMIc now adds its version as part of the user-agent HTTP header.

### v0.18.0 - August 17th 2021

- [gNMI Server](user_guide/gnmi_server.md):

    Add support for a global gNMI server.
    It supports all types of subscriptions, ran against a local cache build out the configured subscriptions.
    It support Get and Set RPCs as well, those are run against the configured targets.

    The gNMI server supports Consul based service registration.

- Outputs:

    Add support for [gNMI server](user_guide/outputs/gnmi_output.md) output type

- [Target configuration](user_guide/targets/targets.md):

    Support multiple IP addresses per target, all addresses are tried simultaneously.
    The first successful gRPC connection is used.

- [Prometheus Output](user_guide/outputs/prometheus_output.md):

    Add the option of generating Prometheus metrics on-scrape, instead of on-reception.
    The gNMI notifications are stored in a local cache and used to generate metrics when a Prometheus server sends a scrape request.

- Event Processors:

    Add [`group-by`](user_guide/event_processors/event_group_by.md) processor, it groups events together based on a given criteria.
    The events can belong to different gNMI notifications or even to different subscriptions.

- Event Processor Convert:

    Add support for boolean conversion

- [Deployment Examples](deployments/deployments_intro.md):

    Add [containerlab](https://containerlab.srlinux.dev) based deployment examples.
    These deployment come with a router fabric built using Nokia's [SRL](https://learn.srlinux.dev)

- [API server](user_guide/api/api_intro.md):

    Add Secure API server configuration options

- Target Loaders:

    [Consul loader](user_guide/targets/target_discovery/consul_discovery.md#services-watch) update: Add support for gNMI target discovery from Consul services.

- Get Request:

    Add printing of Target as part of Path Prefix

- Set Request:

    Add printing of Target as part of Path Prefix

### v0.17.0 - July 14th 2021

- Event Trigger:

    Enhance `event-trigger` to run multiple actions sequentially when an event occurs.

    The output of an action can be used in the following ones.

- Kafka output:

    Add `SASL_SSL` and `SSL` security protocols to kafka output.

- gRPC authentication:

    Add support for token based gRPC authentication.

### v0.16.2 - July 13th 2021

- Fix nil pointer dereference in case a subscription has `suppress-redundant` but no `heartbeat-interval`.

### v0.16.1 - July 12th 2021

- Bump github.com/openconfig/goyang version to v0.2.7
  
### v0.16.0 - June 14th 2021

- Target Discovery:

    Add Docker Engine target loader, `gnmic` can dynamically discover gNMI targets running as docker containers.

- Event Trigger: gNMI action

    Enhance `gNMI action` to take external variables as input, in addition to the received gNMI update.

### v0.15.0 - June 7th 2021

- Subscription:

   Add field `set-target` under subscription config, a boolean that enables setting the target name as a gNMI prefix target.

- Outputs:

   Add `add-target` and `target-template` fields under all outputs,
   Enables adding the target value as a tag/label based on the subscription and target metadata

### v0.14.3 - June 6th 2021

- Set command:

    Fix `ascii` values encoding if used with `--request-file` flag.

### v0.14.2 - June 3rd 2021

- Fix `event-convert` processor when the conversion is between integer types.
- Add an implicit conversion of uint to int if the influxdb output version is 1.8.x.
  This is a workaround for the limited support of influx APIv2 by influxDB1.8

### v0.14.1 - May 31st 2021

- Fix OverrideTS processor
- Add `override-timestamps` option under outputs, to override the message timestamps regardless of the message output format

### v0.14.0 - May 28th 2021

- New Output format `flat`
    - This format prints the Get and Subscribe RPCs as a list of `xpath: value`, where the `xpath` points to a leaf value.

- New `gnmic diff` command:
    - This command prints the difference in responses between a reference target `--ref` and one or more targets to be compared to the reference `--compare`.
    - The output is printed as `flat` format results.
  
### v0.13.0 - May 10th 2021

- New `gnmic generate` Command:
    - Given a set of yang models and an xpath, `gnmic generate` generates a JSON/YAML representation of the YANG object the given path points to.
    - Given a set of yang models and an set of xpaths (with `--update` or `--replace`), `gnmic generate set-request` generates a set request file that can be filled with the desired values and used with `gnmic set --request-file`
    - The sub-command `gnmic generate path` is an alias to `gnmic path`

- Path Command:
    - add flag `--desc` which, if present, prints the YANG leaf description together with the generated paths.
    - add flag `--config-only` which, if present, only generates paths pointing to YANG leaves representing config data.
    - add flag `--state-only` which, if present, only generates paths pointing to a YANG leaf representing state data.

### v0.12.2 - April 24th 2021

- Fix a bug that cause gNMIc to crash if certain processors are used.

### v0.12.1 - April 21st 2021

- Fix parsing of stringArray flags containing a space.

### v0.12.0 - April 20th 2021

- Outputs:
    - InfluxDB and Prometheus outputs: Convert gNMI Decimal64 values to Float64.
- Set Command:
    - Add the ability to run a Set command using a single file, including `replaces`, `updates` and `deletes`.
    - The request file `--request-file` is either a static file or a Golang Text Template rendered separately for each target.
    - The template input is read from a file referenced by the flag `--request-vars`.
  
### v0.11.0 - April 15th 2021

- Processors:
    - Add `event-allow` processor, basically an allow ACL based on `jq` condition or regular expressions.
    - Add `event-extract-tags` processor, it adds tags based on regex named groups from tag names, tag values, value names, or values.
    - Add `gnmi-action` to `event-trigger` processor, the action runs a gNMI Set or Get if the trigger condition is met.
- Set Command:
    - Improve usability by supporting reading values (--update-file and --replace-file) from standard input.

### v0.10.0 - April 8th 2021

- New command:
    - `getset` command: This command conditionally executes both a `Get` and a `Set` RPC, the `GetResponse` is used to evaluate a condition which if met triggers the execution of the `Set` RPC.
- Processors:
    - Some processors' apply condition can be expressed using `jq` instead of regular expressions. 

### v0.9.1 - March 23rd 2021

- Processors:
    - Add `event-trigger` processor: This processor is used to trigger a predefined action if a condition is met.
    - New processor `event-jq` which applies a transformation on the messages expressed as a jq expression.
    
- Shell autocompletion:
    - Shell (bash, zsh and fish) autocompletion scripts can be generated using `gnmic completion [bash|zsh|fish]`.
- gRPC gzip compression:
    - `gnmic` supports gzip compression on gRPC connections.
  
### v0.9.0 - March 11th 2021

- Clustered Prometheus output:
    - When deployed as a cluster, it is possible to register only one of the prometheus outputs in Consul. This is handy in the case of a cluster with data replication.
- Proto file loading at runtime (Nokia SROS):
    - `gnmic` supports loading SROS proto files at runtime to decode gNMI updates with `proto` encoding
- Kafka Output:
    - Kafka SASL support: PLAIN, SCRAM SHA256/SHA512 OAuth mechanisms are supported.
- Configuration:
    - `gnmic` supports configuration using environment variables.
- Processors:
    - add `event-merge` processor.
- Target Loaders:
    - `gnmic` supports target loaders at runtime, new targets can be added to the configuration from a file that `gnmic` watches or from `Consul`
  
### v0.8.0 - March 2nd 2021

- Inputs:
    - Processors can now be applied by the input plugins.
- Prometheus output:
    - The Prometheus output can now register as a service in Consul, a Prometheus client can discover the output using consul service discovery.
- Clustering:
    - `gnmic` can now run as a cluster, this requires a running Consul instance that will be used by the `gnmic` instance for leader election and target load sharing.
- Configuration file:
    - The default configuration file placement now follows [XDG](https://wiki.archlinux.org/index.php/XDG_Base_Directory) recommendations
- CLI exit status:
    - Failure of most commands is properly reflected in the cli exit status.
- Configuration:
    - Configuration fields that are OS paths are expanded by `gnmic`
- Deployment examples:
    - A set of deployment examples is added to the repo and the docs.
  
### v0.7.0 - January 28th 2021

- Prometheus output metrics customization:
    - `metric-prefix` and `append-subscription-name` can be used to change the default metric prefix and append the subscription name to the metric name.
    - `export-timestamps`: enables/disables the export of timestamps together with the metric.
    - `strings-as-labels`: enables/disables automatically adding paths with a value of type string as a metric label.

- NATS output:
    - allow multiple NATS workers under NATS output via field `num-workers`.
    - add NATS prometheus internal metrics.

- STAN output:
    - allow multiple STAN workers under STAN output via field `num-workers`.
    - add NATS prometheus internal metrics.

- File output:
    - add File prometheus metrics.
  
- Inputs:
    - support ingesting gNMI data from NATS, STAN or a Kafka message bus.


### v0.6.0 - December 14th 2020

- Processors:
    - Added processors to `gnmic`, a set of basic processors can be used to manipulate gNMI data flowing through `gnmic`. These processors are applied by the output plugins

- Upgrade command: `gnmic` can be upgraded using `gnmic version upgrade` command.

### v0.5.2 - December 1st 2020
- Outputs:
    - Improve outputs logging
    - Add Prometheus metrics to Kafka output

### v0.5.1 - November 28th 2020
- Prompt Mode:
    - Fix subscribe RPC behavior
- QoS:
    - Do not populate QoS field if not set via config file or flag.
Outputs:
    - add configurable number of workers to some outputs.

### v0.5.0 - November 25th 2020
- Prompt Mode:
    - Add prompt sub commands.
- XPATH parsing:
    - Add custom xpath parsingto gnmi.Path to allow for paths including column `:`.
- TLS:
    - Allow configurable TLS versions per target, the minimum, the maximum and the preferred TLS versions ca be configured.
  
### v0.4.3 - November 10th 2020
- Missing path:
    - Initialize the path field if not present in SubscribeResponse
  
### v0.4.2 - November 5th 2020
- YANG:
    - Prompt command flags `--file` and `--dir` support globs.
- Subscribe:
    - added flags `--output` that allows to choose a single output for `subscribe` updates
- Prompt:
    - Max suggestions is automatically adjusted based on the terminal height.
    - Add suggestions for address and subscriptions.

### v0.4.1 - October 22nd 2020
- Prompt:
    - Add suggestions of xpath with origin, `--suggest-with-origin`.
### v0.4.0 - October 21st 2020
- New Command:
    - Add new command `prompt`
- Prompt:
    - Add ctrl+z key bind to delete a single path element.
    - Add YANG info to xpath suggestions.
    - Add GoLeft, GoRight key binds.
    - Sort xpaths and prefixes suggestions.
    - xpaths suggestions are properly generated if a prefix is present.
    - flag `--suggest-all-flags` allows adding global flags suggestion in prompt mode.
  
- Prometheus output:
    - Add support for Prometheus output plugin.
    
### v0.3.0 - October 1st 2020
- InfluxDB output:
    - Add support for influxDB output plugin.

### v0.2.3 - September 18th 2020
- Retry
    - Add basic RPC retry mechanism.
- ONCE mode subscription:
    - Handle targets that send an EOF error instead of a SyncResponse to signify the end of ONCE subscriptions.
- Docker image:
    - Docker images added to ghcr.io as well as docker hub.
  
### v0.2.2 - September 3rd 2020
- CLI:
    - Properly handle paths that include quotes.
- Unix Socket:
    - Allow send/rcv of gNMI data to/from a unix socket.
- Outputs:
    - Add TCP output plugin.

### v0.2.1 - August 11th 2020
- Releases:
    - Add .deb. and .rpm packages to releases.
 - Outputs:
    - Add UDP output plugin. 

### v0.2.0 - August 7th 2020
- Releases:
    - Add ARM releases.
    - Push docker image to docker hub.
  
### v0.1.1 - July 23rd 2020
- Set Cmd:
    - Support `json_ietf` encoding when the value is specified from a file.
  
### v0.1.0 - July 16th 2020
- Outputs:
    - Allow NATS/STAN output subject customization.

### v0.0.7 - July 16th 2020
- gNMI Target:
    - Add support for gNMI Target field.
- gNMI Origin:
    - Add support for gNMI Origin field.  
- Prometheus internal metrics:
    - Add support for `gnmic` internal metrics via a Prometheus server.
- Outputs:
    - Add support for multiple output plugins (file, NATS, STAN, Kafka)
- Targets:
    - Support target specific configuration.
- Poll Subscription:
    - Allow selecting polled targets and subscription using a CLI select menu.
- gNMI Models:
    - Support multiple Models in Get and Subscribe RPCs.

### v0.0.6 - June 2nd 2020
- Nokia Dialout:
    - Add Support for Nokia Dialout telemetry.
- Printing:
    - Convert timestamps to Time.

### v0.0.5 - May 18th 2020
- Formatting:
    - Add `textproto` format.

### v0.0.4 - May 11th 2020
- Logging:
    - Support logging to file instead of Stderr.
- Set Command:
    - support Set values from YAML file.

### v0.0.3 - April 23rd 2020
- Proxy:
    - Allow usage of ENV proxy values for gRPC connections.
- Installation:
    - Add installation script.

### v0.0.2 - April 13th 2020
- Terminal printing clean up.
- Path Command: Add search option.

### v0.0.1 - March 24th 2020
- Capabilities RPC Command.
- Get RPC Command.
- Subscribe RPC Command.
- Set RPC Command.
- TLS support.
- Version Command.
- Path Commnd.

### initial Commit - February 20th 2020


================================================
FILE: docs/cmd/capabilities.md
================================================
## Description

The `[cap | capabilities]` command represents the [gNMI Capabilities RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L51).

It is used to send a [Capability Request](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L431) to the specified target(s) and expects one [Capability Response](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L440) per target.

[Capabilities](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#32-capability-discovery) allows the client to retrieve the set of capabilities that is supported by the target:

* gNMI version
* available data models
* supported encodings
* gNMI extensions

This allows the client to, for example, validate the service version that is implemented and retrieve the set of models that the target supports. The models can then be specified in subsequent Get/Subscribe RPCs to precisely tell the target which models to use.

### Usage

`gnmic [global-flags] capabilities [local-flags]`

### Examples

#### single host

```text
gnmic -a <ip:port> --username <user> --password <password> \
      --insecure capabilities

gNMI_Version: 0.7.0
supported models:
  - nokia-conf, Nokia, 19.10.R2
  - nokia-state, Nokia, 19.10.R2
  - nokia-li-state, Nokia, 19.10.R2
  - nokia-li-conf, Nokia, 19.10.R2
<< SNIPPED >>
supported encodings:
  - JSON
  - BYTES
```

#### multiple hosts

```bash
gnmic -a <ip:port>,<ip:port> -u <user> -p <password> \
      --insecure cap
```



<script id="asciicast-319561" src="https://asciinema.org/a/319561.js" async></script>

================================================
FILE: docs/cmd/collector.md
================================================
### Description

The `[collect | collector | coll | c]` command starts gNMIc as a long-running telemetry collector service. Unlike the `subscribe` command which is designed for interactive use, the collector command is optimized for production deployments with dynamic configuration capabilities via REST API.

The collector provides:

- **Dynamic configuration** - Add, modify, or remove targets, subscriptions, outputs, inputs, and processors at runtime via REST API
- **Clustering support** - Multiple collector instances can form a cluster with automatic target distribution and failover
- **Embedded gNMI server** - Expose collected telemetry to downstream gNMI clients
- **Tunnel target support** - Accept connections from gNMI tunnel targets

### Usage

`gnmic [global-flags] collect [local-flags]`

### Local Flags

#### pyroscope-server-address

The `[--pyroscope-server-address]` flag sets the Pyroscope server address for continuous profiling. When set, the collector will send profiling data to the specified Pyroscope server.

#### pyroscope-application-name

The `[--pyroscope-application-name]` flag sets the application name used in Pyroscope. Defaults to `gnmic-collector`.

### Subcommands

The collector command provides subcommands to interact with a running collector instance via its REST API:

| Subcommand | Aliases | Description |
|------------|---------|-------------|
| `targets` | `target`, `tg` | Manage targets |
| `subscriptions` | `subscription`, `sub` | Manage subscriptions |
| `outputs` | `output`, `out` | Manage outputs |
| `inputs` | `input`, `in` | Manage inputs |
| `processors` | `processor`, `proc` | Manage processors |

Each subcommand supports the following operations:

| Operation | Aliases | Description |
|-----------|---------|-------------|
| `list` | `ls` | List all resources |
| `get` | `g`, `show`, `sh` | Get a specific resource |
| `set` | `create`, `cr` | Create or update a resource |
| `delete` | `d`, `del`, `rm` | Delete a resource |

### Configuration

The collector is configured using the standard gNMIc configuration file. The key sections are:

```yaml
# API server configuration (required for collector)
api-server:
  address: :7890
  timeout: 10s
  tls:
    ca-file:
    cert-file:
    key-file:
  enable-metrics: false
  debug: false

# Targets to collect from
targets:
  router1:
    address: 10.0.0.1:57400
    username: admin
    password: admin
    skip-verify: true

# Subscriptions define what data to collect
subscriptions:
  interfaces:
    paths:
      - /interfaces/interface/state/counters
    mode: stream
    stream-mode: sample
    sample-interval: 10s

# Outputs define where to send collected data
outputs:
  prometheus:
    type: prometheus
    listen: :9804
    path: /metrics

# Inputs for receiving data from message queues
inputs:
  nats-input:
    type: nats
    address: nats://localhost:4222
    subject: telemetry.>

# Event processors for data transformation
processors:
  add-hostname:
    event-add-tag:
      tags:
        - tag-name: hostname
          value: ${HOST}

# Clustering configuration (optional)
clustering:
  cluster-name: gnmic-cluster
  instance-name: gnmic-1
  locker:
    type: consul
    address: consul:8500

# gNMI server configuration (optional)
gnmi-server:
  address: :57401
  skip-verify: true
```

### Examples

#### 1. Start a basic collector

```bash
gnmic --config collector.yaml collect
```

#### 2. Start with Pyroscope profiling

```bash
gnmic --config collector.yaml collect \
      --pyroscope-server-address http://pyroscope:4040 \
      --pyroscope-application-name my-collector
```

#### 3. List targets from a running collector

```bash
gnmic --config collector.yaml collect targets list
```

Output:
```
NAME      ADDRESS         USERNAME  STATE    SUBSCRIPTIONS  OUTPUTS  INSECURE  SKIP VERIFY
router1   10.0.0.1:57400  admin     running  2              1        false     true
router2   10.0.0.2:57400  admin     running  2              1        false     true
```

#### 4. Get details of a specific target

```bash
gnmic --config collector.yaml collect targets get --name router1
```

#### 5. Create a new target

```bash
gnmic --config collector.yaml collect targets set --input target.yaml
```

Where `target.yaml` contains:
```yaml
name: router3
address: 10.0.0.3:57400
username: admin
password: admin
skip-verify: true
subscriptions:
  - interfaces
outputs:
  - prometheus
```

#### 6. Delete a target

```bash
gnmic --config collector.yaml collect targets delete --name router3
```

#### 7. List subscriptions

```bash
gnmic --config collector.yaml collect subscriptions list
```

Output:
```
NAME        PREFIX  PATHS                                    ENCODING  MODE           SAMPLE INTERVAL  TARGETS  OUTPUTS
interfaces  -       /interfaces/interface/state/counters     json      stream/sample  10s              2/2      1
```

#### 8. List outputs

```bash
gnmic --config collector.yaml collect outputs list
```

Output:
```
NAME        TYPE        FORMAT  EVENT PROCESSORS
prometheus  prometheus  -       1
```

#### 9. List processors with details

```bash
gnmic --config collector.yaml collect processors list --details
```

### See Also

- [Collector Introduction](../user_guide/collector/collector_intro.md) - Overview and architecture
- [Collector Configuration](../user_guide/collector/collector_configuration.md) - Detailed configuration reference
- [Collector REST API](../user_guide/collector/collector_api.md) - API endpoints reference


================================================
FILE: docs/cmd/diff/diff.md
================================================

### Description

The `diff` command is similar to a `get` or `subscribe` (mode ONCE) commands ran against at least 2 targets, a reference and one or more compared targets.
The command will compare the returned responses from the compared targets to the ones returned from the reference target and only print the difference between them.

The output is printed as a list "flattened" gNMI updates, each line containing an XPath pointing to a leaf followed by its value.

Each line is preceded with either signs `+` or `-`:

- `+` means the leaf and its value are present in the compared target but not in the reference target.
- `-` means the leaf and its value are present in the reference target but not in the compared target.

e.g:

```text
+	network-instance[name=default]/interface[name=ethernet-1/36.0]: {}
-	network-instance[name=default]/protocols/bgp/autonomous-system: 101
```

The output above indicates:

- The compared target has interface `ethernet-1/36.0` added to network instance `default` while the reference doesn't.
- The compared target is missing the autonomous-system `101` configuration under network-instance `default` protocols/bgp compared to the reference.

The data to be compared is specified with the flag `--path`, which can be set multiple times to compare multiple data sets.
By default, the data it is retrieved using a `Get RPC`, if the flag `--sub` is present, a `Subscribe RPC` with mode ONCE is used instead.

Each of the `get` and `subscribe` methods has pros and cons, with the `get` method you can choose to compare `CONFIG` or `STATE` only, via the flag `--type`.
The `subscribe` method allows to stream the response(s) in case a larger data set needs to be compared. In addition to that, some routers support more encoding options when using the `subscribe RPC`

Multiple targets can be compared to the reference at once, the printed output of each difference will start with the line `"$reference" vs "$compared"`

Aliases: `compare`

### Usage

`gnmic [global-flags] diff [local-flags]`

### Flags

#### ref

The `--ref` flag is a mandatory flag that specifies the target to used as reference to compare other targets to.

#### compare

The `--compare` flag is a mandatory flag that specifies the targets to compare to the reference target.

#### prefix

As per [path prefixes](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#241-path-prefixes), the prefix `[--prefix]` flag represents a common prefix that is applied to all paths specified using the local `--path` flag. Defaults to `""`.

#### path

The mandatory path flag `[--path]` is used to specify the [path(s)](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) the client wants to receive a snapshot of.

Multiple paths can be specified by using multiple `--path` flags:

```bash
gnmic --insecure \
      --ref router1
      --compare router2,router3
      diff --path "/state/ports[port-id=*]" \
           --path "/state/router[router-name=*]/interface[interface-name=*]"
```

If a user needs to provide [origin](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) information to the Path message, the following pattern should be used for the path string: `"origin:path"`:

#### model

The optional model flag `[--model]` is used to specify the schema definition modules that the target should use when returning a GetResponse. The model name should match the names returned in Capabilities RPC. Currently only single model name is supported.

#### target

With the optional `[--target]` flag it is possible to supply the [path target](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#2221-path-target) information in the prefix field of the GetRequest message.

#### type

The type flag `[--type]` is used to specify the [data type](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L399) requested from the server.

One of:  ALL, CONFIG, STATE, OPERATIONAL (defaults to "ALL")

#### sub

When the flag `--sub` is present, `gnmic` will use a `Subscribe RPC` with mode ONCE, instead of a `Get RPC` to retrieve the data to be compared.

### Examples

```bash
gnmic diff -t config --skip-verify -e ascii \
           --ref clab-te-leaf1 \
           --compare clab-te-leaf2 \
           --path /network-instance
```

```bash
"clab-te-leaf1:57400" vs "clab-te-leaf2:57400"
+	network-instance[name=default]/interface[name=ethernet-1/36.0]                                    : {}
-	network-instance[name=default]/protocols/bgp/autonomous-system                                    : 101
+	network-instance[name=default]/protocols/bgp/autonomous-system                                    : 102
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:11:1]            : {}
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:11:1]/admin-state: enable
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:11:1]/peer-as    : 201
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:11:1]/peer-group : eBGPv6
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:12:1]            : {}
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:12:1]/admin-state: enable
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:12:1]/peer-as    : 202
-	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:12:1]/peer-group : eBGPv6
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:21:1]            : {}
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:21:1]/admin-state: enable
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:21:1]/peer-as    : 201
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:21:1]/peer-group : eBGPv6
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:22:1]            : {}
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:22:1]/admin-state: enable
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:22:1]/peer-as    : 202
+	network-instance[name=default]/protocols/bgp/neighbor[peer-address=2002::192:168:22:1]/peer-group : eBGPv6
+	network-instance[name=default]/protocols/bgp/router-id                                            : 10.0.1.2
-	network-instance[name=default]/protocols/bgp/router-id                                            : 10.0.1.1
-	network-instance[name=myins]                                                                      : {}
-	network-instance[name=myins]/admin-state                                                          : enable
-	network-instance[name=myins]/description                                                          : desc1
-	network-instance[name=myins]/interface[name=ethernet-1/36.0]                                      : {}
-	network-instance[name=myins]/type                                                                 : ip-vrf
```


================================================
FILE: docs/cmd/diff/diff_set_to_notifs.md
================================================
### Description

The `diff set-to-notifs` command is used to verify whether a set of
notifications from a `GetResponse` or a stream of `SubscribeResponse` messages
comply with a `SetRequest` messages in textproto format. The envisioned use case
is to check whether a stored snapshot of device state matches that of the
intended state as specified by a `SetRequest`.

The output is printed as a list of "flattened" gNMI updates, each line
containing an XPath pointing to a leaf followed by its value.

Each line is preceded with either signs `+` or `-`:

-   `+` means the leaf and its value are present in the new SetRequest but not
    in the reference SetRequest.
-   `-` means the leaf and its value are present in the reference SetRequest but
    not in the new SetRequest.

e.g:

```text
SetToNotifsDiff(-want/SetRequest, +got/Notifications):
- /lacp/interfaces/interface[name=Port-Channel9]/config/interval: "FAST"
- /lacp/interfaces/interface[name=Port-Channel9]/config/name: "Port-Channel9"
- /lacp/interfaces/interface[name=Port-Channel9]/name: "Port-Channel9"
- /network-instances/network-instance[name=VrfBlue]/config/name: "VrfBlue"
- /network-instances/network-instance[name=VrfBlue]/config/type: "openconfig-network-instance-types:L3VRF"
- /network-instances/network-instance[name=VrfBlue]/name: "VrfBlue"
m /system/config/hostname:
  - "violetsareblue"
  + "rosesarered"
```

The output above indicates:

-   The set of paths starting with
    `/lacp/interfaces/interface[name=Port-Channel9]/config/interval: "FAST"` are
    present in the SetRequest but missing in the response from the device.
-   The value at path `/system/config/hostname` does not match that of the
    SetRequest.

When `--full` is specified, values common between the SetRequest and the
response messages are also shown.

### How to obtain a GetResponse or SubscribeResponse

To obtain GetRespnse/SubscribeResponse in textproto format, simply run `gnmic`'s
subscribe or get functions and pass in the flag `--format prototext`.

Responses retrieved from either GetRequest or SubscribeRequest are supported by
this command's `--response` flag.

### Usage

`gnmic [global-flags] diff set-to-notifs [local-flags]`

### Flags

#### setrequest

The `--setrequest` flag is a mandatory flag that specifies the reference gNMI
SetRequest textproto file for comparing against the new SetRequest.

#### response

The `--response` flag is a mandatory flag that specifies the gNMI Notifications
textproto file (can contain a GetResponse or SubscribeResponse stream) for
comparing against the reference SetRequest.

### Examples

```bash
$ gnmic diff set-to-notifs --setrequest cmd/demo/setrequest.textproto --response cmd/demo/subscriberesponses.textproto
```


================================================
FILE: docs/cmd/diff/diff_setrequest.md
================================================
### Description

The `diff setrequest` command is used to compare the intent between two
`SetRequest` messages encoded in textproto format.

The output is printed as a list of "flattened" gNMI updates, each line
containing an XPath pointing to a leaf followed by its value.

Each line is preceded with either signs `+` or `-`:

-   `+` means the leaf and its value are present in the new SetRequest but not
    in the reference SetRequest.
-   `-` means the leaf and its value are present in the reference SetRequest but
    not in the new SetRequest.

e.g:

```text
SetRequestIntentDiff(-A, +B):
-------- deletes/replaces --------
+ /network-instances/network-instance[name=VrfBlue]: deleted or replaced only in B
-------- updates --------
m /system/config/hostname:
  - "violetsareblue"
  + "rosesarered"
```

The output above indicates:

-   The new target deletes or replaces the path
    `/network-instances/network-instance[name=VrfBlue]` while the reference
    doesn't.
-   The new target changes the value of `/system/config/hostname` compared to
    the reference from `"violetsareblue"` to `"rosesarered"`.

When `--full` is specified, values common between the two SetRequest are also
shown.

### SetRequest Intent

It is possible for two SetRequests to be different but which are semantically
equivalent -- i.e. they both modify the same leafs in the same ways. In other
words, their overall effects are the same.

For example, a replace on the leaf `/system/config/hostname` with the value
`"foo"` is the same as an update on the same leaf with the same value. A replace
on the container `/system/` with the value `{ config: { hostname: "foo" } }` is
the same as a delete on that container followed by a replace to the leaf.
Overwrites are also possible, although this is currently unsupported.

In order to compare equivalent SetRequests correctly, this tool breaks down a
SetRequest into its "minimal intent" (deletes followed by updates) prior to the
diff computation. This is why the output groups deletes/replaces into the same
section.

### Usage

`gnmic [global-flags] diff setrequest [local-flags]`

### Flags

#### ref

The `--ref` flag is a mandatory flag that specifies the reference gNMI
SetRequest textproto file for comparing against the new SetRequest.

#### new

The `--new` flag is a mandatory flag that specifies the new gNMI SetRequest
textproto file for comparing against the reference SetRequest.

### Examples

```bash
$ gnmic diff setrequest --ref cmd/demo/setrequest.textproto --new cmd/demo/setrequest2.textproto
```


================================================
FILE: docs/cmd/generate/generate_path.md
================================================


### Description 

The path sub command is an alias for the [`gnmic path`](../../cmd/path.md) command.


================================================
FILE: docs/cmd/generate/generate_set_request.md
================================================

### Description

The set-request sub command generates a Set request file given a list of update and/or replace paths.

If no paths are supplied, a root (`/`) replace path is used as a default.

The generated file can be manually edited and used with `gnmic` set command:

`gnmic set --request-file <path_to_generated_file>`

Aliases: `sreq`, `srq`, `sr`

### Usage

`gnmic [global-flags] generate [generate-flags] set-request [sub-command-flags]`

### Flags

#### update

The `--update` flag specifies a valid xpath, used to generate an __updates__ section of the [set request file](../set.md#template-based-set-request).

Multiple `--update` flags can be supplied.

#### replace

The `--replace` flag specifies a valid xpath, used to generate a __replaces__ section of the [set request file](../set.md#template-based-set-request).

Multiple `--replace` flags can be supplied.

### Examples

#### Openconfig

YANG repo: [openconfig/public](https://github.com/openconfig/public)

Clone the OpenConfig repository:

```bash
git clone https://github.com/openconfig/public
cd public
```

```bash
gnmic --encoding json_ietf \
          generate  \
          --file release/models \
          --dir third_party \
          --exclude ietf-interfaces \
          set-request \
          --replace /interfaces/interface/subinterfaces/subinterface/ipv4/addresses/address
```

The above command generates the below YAML output (JSON if `--json` flag is supplied)

```yaml
replaces:
- path: /interfaces/interface/subinterfaces/subinterface/ipv4/addresses/address
  value:
  - config:
      ip: ""
      prefix-length: ""
    ip: ""
    vrrp:
      vrrp-group:
      - config:
          accept-mode: "false"
          advertisement-interval: "100"
          preempt: "true"
          preempt-delay: "0"
          priority: "100"
          virtual-address: ""
          virtual-router-id: ""
        interface-tracking:
          config:
            priority-decrement: "0"
            track-interface: ""
        virtual-router-id: ""
  encoding: JSON_IETF
```

The __value__ section can be filled with the desired configuration variables.


#### Nokia SR OS

```bash
git clone https://github.com/nokia/7x50_YangModels
cd 7x50_YangModels
git checkout sros_21.2.r2
```

```bash
gnmic generate \
        --file YANG/nokia-combined \
        --dir YANG \
        set-request \
        --replace /configure/service/vprn/bgp/family
```

The above command generates the below YAML output (JSON if `--json` flag is supplied)

```yaml
replaces:
- path: /configure/service/vprn/bgp/family
  value:
    flow-ipv4: "false"
    flow-ipv6: "false"
    ipv4: "true"
    ipv6: "false"
    label-ipv4: "false"
    mcast-ipv4: "false"
    mcast-ipv6: "false"
```

#### Cisco

YANG repo: [YangModels/yang](https://github.com/YangModels/yang)

Clone the `YangModels/yang` repo and change into the main directory of the repo:

```bash
git clone https://github.com/YangModels/yang
cd yang/vendor
```

```bash
gnmic --encoding json_ietf \
          generate  \
          --file vendor/cisco/xr/721/Cisco-IOS-XR-um-router-bgp-cfg.yang \
          --file vendor/cisco/xr/721/Cisco-IOS-XR-ipv4-bgp-oper.yang \
          --dir standard/ietf \
          set-request \
          --path /active-nodes
```

The above command generates the below YAML output (JSON if `--json` flag is supplied)

```yaml
replaces:
- path: /active-nodes
  value:
    active-node:
    - node-name: ""
      selective-vrf-download:
        role:
          address-family:
            ipv4:
              unicast: ""
            ipv6:
              unicast: ""
        vrf-groups:
          vrf-group:
          - vrf-group-name: ""
  encoding: JSON_IETF
```

#### Juniper

YANG repo: [Juniper/yang](https://github.com/Juniper/yang)

Clone the Juniper YANG repository and change into the release directory:

```bash
git clone https://github.com/Juniper/yang
cd yang/20.3/20.3R1
```

```bash
gnmic --encoding json_ietf \
          generate
          --file junos/conf \
          --dir common 
          set-request \
          --replace /configuration/interfaces/interface/unit/family/inet/address
```

The above command generates the below YAML output (JSON if `--json` flag is supplied)

```yaml
replaces:
- path: /configuration/interfaces/interface/unit/family/inet/address
  value:
  - apply-groups: ""
    apply-groups-except: ""
    apply-macro:
    - data:
      - name: ""
        value: ""
      name: ""
    arp:
    - case_1: ""
      case_2: ""
      l2-interface: ""
      name: ""
      publish: ""
    broadcast: ""
    destination: ""
    destination-profile: ""
    master-only: ""
    multipoint-destination:
    - apply-groups: ""
      apply-groups-except: ""
      apply-macro:
      - data:
        - name: ""
          value: ""
        name: ""
      case_1: ""
      case_2: ""
      epd-threshold:
        apply-groups: ""
        apply-groups-except: ""
        apply-macro:
        - data:
          - name: ""
            value: ""
          name: ""
        epd-threshold-plp0: ""
        plp1: ""
      inverse-arp: ""
      name: ""
      oam-liveness:
        apply-groups: ""
        apply-groups-except: ""
        apply-macro:
        - data:
          - name: ""
            value: ""
          name: ""
        down-count: ""
        up-count: ""
      oam-period:
        disable: {}
        oam_period: ""
      shaping:
        apply-groups: ""
        apply-groups-except: ""
        apply-macro:
        - data:
          - name: ""
            value: ""
          name: ""
        cbr:
          cbr-value: ""
          cdvt: ""
        queue-length: ""
        rtvbr:
          burst: ""
          cdvt: ""
          peak: ""
          sustained: ""
        vbr:
          burst: ""
          cdvt: ""
          peak: ""
          sustained: ""
      transmit-weight: ""
    name: ""
    preferred: ""
    primary: ""
    virtual-gateway-address: ""
    vrrp-group:
    - advertisements-threshold: ""
      apply-groups: ""
      apply-groups-except: ""
      apply-macro:
      - data:
        - name: ""
          value: ""
        name: ""
      authentication-key: ""
      authentication-type: ""
      case_1: ""
      case_2: ""
      case_3: ""
      name: ""
      preferred: ""
      priority: ""
      track:
        apply-groups: ""
        apply-groups-except: ""
        apply-macro:
        - data:
          - name: ""
            value: ""
          name: ""
        interface:
        - apply-groups: ""
          apply-groups-except: ""
          apply-macro:
          - data:
            - name: ""
              value: ""
            name: ""
          bandwidth-threshold:
          - name: ""
            priority-cost: ""
          name: ""
          priority-cost: ""
        priority-hold-time: ""
        route:
        - priority-cost: ""
          route_address: ""
          routing-instance: ""
      virtual-link-local-address: ""
      vrrp-inherit-from:
        active-group: ""
        active-interface: ""
        apply-groups: ""
        apply-groups-except: ""
        apply-macro:
        - data:
          - name: ""
            value: ""
          name: ""
    web-authentication:
      apply-groups: ""
      apply-groups-except: ""
      apply-macro:
      - data:
        - name: ""
          value: ""
        name: ""
      http: ""
      https: ""
      redirect-to-https: ""
  encoding: JSON_IETF
```

#### Arista

YANG repo: [aristanetworks/yang](https://github.com/aristanetworks/yang)

Arista uses a subset of OpenConfig modules and does not provide IETF modules inside their repo. So make sure you have IETF models available so you can reference it, a `openconfig/public` is a good candidate.

Clone the Arista YANG repo:

```bash
git clone https://github.com/aristanetworks/yang
cd yang
```

The above command generates the below YAML output (JSON if `--json` flag is supplied)

```bash
gnmic --encoding json_ietf \
          generate
          --file EOS-4.23.2F/openconfig/public/release/models \
          --dir ../openconfig/public/third_party/ietf \
          --exclude ietf-interfaces \
          set-request \
          --replace bgp/neighbors/neighbor/config
```

```yaml
replaces:
- path: bgp/neighbors/neighbor/config
  value:
    auth-password: ""
    description: ""
    enabled: "true"
    local-as: ""
    neighbor-address: ""
    peer-as: ""
    peer-group: ""
    peer-type: ""
    remove-private-as: ""
    route-flap-damping: "false"
    send-community: NONE
```


================================================
FILE: docs/cmd/generate.md
================================================


### Description

Most `gNMI` targets use YANG as a modeling language for their datastores.
It order to access and manipulate the stored data (`Get`, `Set`, `Subscribe`), a tool should be aware of the underlying YANG model, be able to generate paths pointing to the desired `gNMI` objects as well as building configuration payloads matching data instances on the targets.

The `generate` command takes the target's YANG models as input and generates:

- Paths in `xpath` or `gNMI` formats.
- Configuration payloads that can be used as [update](../cmd/set.md#3-update-with-a-value-from-json-or-yaml-file) or [replace](../cmd/set.md#3-replace-with-a-value-from-json-or-yaml-file) input files for the Set command.
- A Set request file that can be used as a [template](../cmd/set.md#template-based-set-request) with the Set command.

Aliases: `gen`

### Usage

`gnmic [global-flags] generate [local-flags]`

or

`gnmic [global-flags] generate [local-flags] sub-command [sub-command-flags]`

### Persistent Flags

#### output

The `--output` flag specifies the file to which the generated output will be written, defaults to `stdout`

#### json

When used with `generate` command, the `--json` flag, if present changes the output format from YAML to JSON.

When used with `generate path` command, it outputs the path, the leaf **type**, its **description**, its **default value** and if it is a **state leaf** or not in an array of JSON objects.

### Local Flags

#### path

The `--path` flag specifies the path whose payload (JSON/YAML) will be generated.

Defaults to `/`

#### config-only

The `--config-only` flag, if present instruct `gnmic` to generate JSON/YAML payloads from YANG nodes not marked as `config false`.

#### camel-case

The `--camel-case` flag, if present allows to convert all the keys in the generated JSON/YAML paylod to `CamelCase`

#### snake-case

The `--snake-case` flag, if present allows to convert all the keys in the generated JSON/YAML paylod to `snake_case`

### Sub Commands

#### Path

The path sub command is an alias for the [`gnmic path`](../cmd/path.md) command.

#### Set-request

The [set-request](../cmd/generate/generate_set_request.md) sub command generates a Set request file given a list of update and/or replace paths.

### Examples

#### Openconfig

YANG repo: [openconfig/public](https://github.com/openconfig/public)

Clone the OpenConfig repository:

```bash
git clone https://github.com/openconfig/public
cd public
```

```bash
gnmic --encoding json_ietf \
          generate  \
          --file release/models \
          --dir third_party \
          --exclude ietf-interfaces \
          --path /interfaces/interface/subinterfaces/subinterface/ipv4/addresses/address
```

```yaml
- config:
    ip: ""
    prefix-length: ""
  ip: ""
  vrrp:
    vrrp-group:
    - config:
        accept-mode: "false"
        advertisement-interval: "100"
        preempt: "true"
        preempt-delay: "0"
        priority: "100"
        virtual-address: ""
        virtual-router-id: ""
      interface-tracking:
        config:
          priority-decrement: "0"
          track-interface: ""
      virtual-router-id: ""
```


================================================
FILE: docs/cmd/get.md
================================================
### Description

The `get` command represents the gNMI [Get RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L57).

It is used to send a [GetRequest](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L395) to the specified target(s) (using the global flag [`--address`](../global_flags.md#address) and expects one [GetResponse](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L420) per target, per path.

The [Get RPC](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#33-retrieving-snapshots-of-state-information) is used to retrieve a snapshot of data from the target. It requests that the target snapshots a subset of the data tree as specified by the paths included in the message and serializes this to be returned to the client using the specified encoding.

### Usage

`gnmic [global-flags] get [local-flags]`

### Flags

#### prefix

As per [path prefixes](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#241-path-prefixes), the prefix `[--prefix]` flag represents a common prefix that is applied to all paths specified using the local `--path` flag. Defaults to `""`.

#### path

The mandatory path flag `[--path]` is used to specify the [path(s)](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) the client wants to receive a snapshot of.

Multiple paths can be specified by using multiple `--path` flags:

```bash
gnmic -a <ip:port> --insecure \
      get --path "/state/ports[port-id=*]" \
          --path "/state/router[router-name=*]/interface[interface-name=*]"
```

If a user needs to provide [origin](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) information to the Path message, the following pattern should be used for the path string: `"origin:path"`:

!!! note
    The path after the origin value has to start with a `/`

```
gnmic -a <ip:port> --insecure \
      get --path "openconfig-interfaces:/interfaces/interface"
```

#### model

The optional model flag `[--model]` is used to specify the schema definition modules that the target should use when returning a GetResponse. The model name should match the names returned in Capabilities RPC. Currently only single model name is supported.

#### target

With the optional `[--target]` flag it is possible to supply the [path target](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#2221-path-target) information in the prefix field of the GetRequest message.

#### values-only

The flag `[--values-only]` allows to print only the values returned in a GetResponse. This is useful when only the value of a leaf is of interest, like check if a value was set correctly.

#### type

The type flag `[--type]` is used to specify the [data type](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L399) requested from the server.

One of:  ALL, CONFIG, STATE, OPERATIONAL (defaults to "ALL")

#### processor

The `[--processor]` flag allow to list [event processor](../user_guide/event_processors/intro.md) names to be run as a result of receiving the GetReponse messages.

The processors are run in the order they are specified (`--processor proc1,proc2` or `--processor proc1 --processor proc2`).

#### depth

The `[--depth]` flag set the gNMI extension depth value as defined [here](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-depth.md)

### Examples

```bash
# simple Get RPC
gnmic -a <ip:port> get --path "/state/port[port-id=*]"

# Get RPC with multiple paths
gnmic -a <ip:port> get --path "/state/port[port-id=*]" \
      --path "/state/router[router-name=*]/interface[interface-name=*]"

# Get RPC with path prefix
gnmic -a <ip:port> get --prefix "/state" \
      --path "port[port-id=*]" \
      --path "router[router-name=*]/interface[interface-name=*]"
```

<script
id="asciicast-319562" src="https://asciinema.org/a/319562.js" async>
</script>


================================================
FILE: docs/cmd/getset.md
================================================
### Description

The `getset` command is a combination of the gNMI [Get RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L57) and the gNMI [Set RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L62).

It allows to conditionally execute a [Set RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L62) based on a condition evaluated against a [GetResponse](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L420).

The `condition` written as a [`jq expression`](https://stedolan.github.io/jq/), is specified using the flag `--condition`.

The [SetRPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L62) is executed only if the condition evaluates to `true`

### Usage

`gnmic [global-flags] getset [local-flags]`

`gnmic [global-flags] gas [local-flags]`

`gnmic [global-flags] gs [local-flags]`


### Flags

#### prefix

As per [path prefixes](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#241-path-prefixes), the prefix `[--prefix]` flag represents a common prefix that is applied to all paths specified using the local `--get`, `--update`, `--replace` and `--delete` flags. 

Defaults to `""`.

#### get
The mandatory get flag `[--get]` is used to specify the single [path](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) used in the Get RPC.

#### model

The optional model flag `[--model]` is used to specify the schema definition modules that the target should use when returning a GetResponse. The model name should match the names returned in Capabilities RPC. Currently only single model name is supported.

#### target
With the optional `[--target]` flag it is possible to supply the [path target](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#2221-path-target) information in the prefix field of the GetRequest message.

#### type

The type flag `[--type]` is used to specify the [data type](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L399) requested from the server.

One of:  ALL, CONFIG, STATE, OPERATIONAL (defaults to "ALL")

#### condition
The `[--condition]` is a [`jq expression`](https://stedolan.github.io/jq/) that can be used to determine if the Set Request is executed based on the Get Response values.

#### update
The `[--update]` specifies a [`jq expression`](https://stedolan.github.io/jq/) used to build the Set Request update path.

#### replace
The `[--replace]` specifies a [`jq expression`](https://stedolan.github.io/jq/) used to build the Set Request replace path.

#### delete
The `[--delete]` specifies a [`jq expression`](https://stedolan.github.io/jq/) used to build the Set Request delete path.

#### value
The `[--value]` specifies a [`jq expression`](https://stedolan.github.io/jq/) used to build the Set Request value.

### Examples

The command in the below example does the following:

- gets the list of interface indexes to interface name mapping, 

- checks if the interface index (ifindex) 70 exists,

- if it does, the set request changes the interface state to `enable` using the interface name.

```bash
gnmic getset -a <ip:port> \
    --get /interface/ifindex \
    --condition '.[] | .updates[].values[""]["srl_nokia-interfaces:interface"][] | select(.ifindex==70) | (.name != "" or .name !=null)' \
    --update '.[] | .updates[].values[""]["srl_nokia-interfaces:interface"][] | select(.ifindex==70) | "interface[name=" + .name + "]/admin-state"' \
    --value enable
```

================================================
FILE: docs/cmd/listen.md
================================================
### Description
`gnmic` can be used in a "dial-out telemetry" mode by means of the `listen` command. In the dial-out mode:

* a network element is configured with the telemetry paths
* a network element initiates a connection towards the server/collector (`gnmic` acts as a server in that case)

!!! info
    Currently `gnmic` only implements the dial-out support for Nokia[^1] SR OS 20.5.r1+ routers.

### Usage

```bash
gnmic listen [global flags] [local flags]
```

### Flags

#### address

The address flag `[-a | --address]` tells `gnmic` which address to bind an internal server to in an `address:port` format, e.g.: `0.0.0.0:57400`.

#### tls-cert

Path to the TLS certificate can be supplied with `--tls-cert` flag.

#### tls-key

Path to the private key can be supplied with `--tls-key` flag.

#### max-concurrent-streams

To limit the maximum number of concurrent HTTP2 streams use the `--max-concurrent-streams` flag, the default value is 256.

### prometheus-address

The prometheus-address flag `[--prometheus-address]` allows starting a prometheus server that can be scraped by a prometheus client. It exposes metrics like memory, CPU and file descriptor usage.

### Examples

#### TLS disabled server

To start `gnmic` as a server listening on all interfaces without TLS support is as simple as:

```bash
gnmic listen -a 0.0.0.0:57400
```

??? info "SR OS configuration for non TLS dialout connections"
    ```
    /configure system telemetry destination-group "dialout" allow-unsecure-connection
    /configure system telemetry destination-group "dialout" destination 10.2.0.99 port 57400 router-instance "management"
    /configure system telemetry persistent-subscriptions { }
    /configure system telemetry persistent-subscriptions subscription "dialout" admin-state enable
    /configure system telemetry persistent-subscriptions subscription "dialout" sensor-group "port_stats"
    /configure system telemetry persistent-subscriptions subscription "dialout" mode sample
    /configure system telemetry persistent-subscriptions subscription "dialout" sample-interval 1000
    /configure system telemetry persistent-subscriptions subscription "dialout" destination-group "dialout"
    /configure system telemetry persistent-subscriptions subscription "dialout" encoding bytes
    /configure system telemetry sensor-groups { }
    /configure system telemetry sensor-groups { sensor-group "port_stats" }
    /configure system telemetry sensor-groups { sensor-group "port_stats" path "/state/port[port-id=1/1/c1/1]/statistics/in-octets" }
    ```

#### TLS enabled server

By using [tls-cert](#tls-cert) and [tls-key](#tls-key) flags it is possible to run `gnmic` with TLS.

```bash
gnmic listen -a 0.0.0.0:57400 --tls-cert gnmic.pem --tls-key gnmic-key.pem
```

??? info "SR OS configuration for a TLS enabled dialout connections"
    The configuration below does not utilise router-side certificates and uses the certificate provided by the server (gnmic). The router will also not verify the certificate.
    ```
    /configure system telemetry destination-group "dialout" tls-client-profile "client-tls"
    /configure system telemetry destination-group "dialout" destination 10.2.0.99 port 57400 router-instance "management"
    /configure system telemetry persistent-subscriptions { }
    /configure system telemetry persistent-subscriptions subscription "dialout" admin-state enable
    /configure system telemetry persistent-subscriptions subscription "dialout" sensor-group "port_stats"
    /configure system telemetry persistent-subscriptions subscription "dialout" mode sample
    /configure system telemetry persistent-subscriptions subscription "dialout" sample-interval 1000
    /configure system telemetry persistent-subscriptions subscription "dialout" destination-group "dialout"
    /configure system telemetry persistent-subscriptions subscription "dialout" encoding bytes
    /configure system telemetry sensor-groups { }
    /configure system telemetry sensor-groups { sensor-group "port_stats" }
    /configure system telemetry sensor-groups { sensor-group "port_stats" path "/state/port[port-id=1/1/c1/1]/statistics/in-octets" }

    /configure system security tls client-cipher-list "client-ciphers" { }
    /configure system security tls client-cipher-list "client-ciphers" cipher 1 name tls-rsa-with-aes128-cbc-sha
    /configure system security tls client-cipher-list "client-ciphers" cipher 2 name tls-rsa-with-aes128-cbc-sha256
    /configure system security tls client-cipher-list "client-ciphers" cipher 3 name tls-rsa-with-aes256-cbc-sha
    /configure system security tls client-cipher-list "client-ciphers" cipher 4 name tls-rsa-with-aes256-cbc-sha256
    
    /configure system security tls client-tls-profile "client-tls" admin-state enable
    /configure system security tls client-tls-profile "client-tls" cipher-list "client-ciphers"
    ```

[^1]: Nokia dial-out proto definition can be found in [karimra/sros-dialout](https://github.com/karimra/sros-dialout/blob/master/NOKIA-dial-out-telemetry.proto)


================================================
FILE: docs/cmd/path.md
================================================
### Description

With `path` command it is possible to generate and search through the XPATH style paths extracted from a YANG file.

By extracting the XPATH styled paths from a YANG model it is made possible to utilize CLI search tools like `awk`, `sed` and alike to find the paths satisfying specific matching rules.

The embedded search capability allows to perform a quick and simple search through the model's paths using simple inclusion/exclusion operators.

### Flags

#### types

When `--types` flag is present the extracted paths will also have a corresponding type printed out.

#### path-type

The `--path-type` flag governs which style is used to display the path information. The default value is `xpath` which will produce the XPATH compatible paths.

The other option is `gnmi` which will result in the paths to be formatted using the gNMI Path Conventions.

=== "XPATH"
    ```bash
    /state/sfm[sfm-slot=*]/hardware-data/firmware-revision-status
    ```

=== "gNMI"
    ```bash
    elem:{name:"state"}  elem:{name:"sfm"  key:{key:"sfm-slot"  value:"*"}}  elem:{name:"hardware-data"}  elem:{name:"firmware-revision-status"}
    ```

#### search

With the `--search` flag present an interactive CLI search dialog is displayed that allows to navigate through the paths list and perform a search.

```bash
❯ gnmic path --file _test/nokia-state-combined.yang --search
Use the arrow keys to navigate: ↓ ↑ → ←  and : toggles search
? select path: 
    /state/aaa/radius/statistics/coa/dropped/bad-authentication
    /state/aaa/radius/statistics/coa/dropped/missing-auth-policy
  ▸ /state/aaa/radius/statistics/coa/dropped/invalid
    /state/aaa/radius/statistics/coa/dropped/missing-resource
    /state/aaa/radius/statistics/coa/received
    /state/aaa/radius/statistics/coa/accepted
    /state/aaa/radius/statistics/coa/rejected
    /state/aaa/radius/statistics/disconnect-messages/dropped/bad-authentication
    /state/aaa/radius/statistics/disconnect-messages/dropped/missing-auth-policy
↓   /state/aaa/radius/statistics/disconnect-messages/dropped/invalid
```

#### descr

When the `--descr` flag is present, the leaf description is printed after the path, indented with a `\t`.

#### config-only

When the `--config-only` flag is present, paths are generated only for YANG leaves representing config data.

#### state-only

When the `--state-only` flag is present, paths are generated only for YANG leaves representing state data.

#### with-non-leaves

When the `--with-non-leaves` flag is present, paths are generated not only for YANG leaves.

### Examples

```bash
# output to stdout the XPATH styled paths
# from the nokia-state module of nokia-state-combined.yang file
gnmic path --file nokia-state-combined.yang

# from the nokia-conf module
gnmic path -m nokia-conf --file nokia-conf-combined.yang

# with the gNMI styled paths
gnmic path --file nokia-state-combined.yang --path-type gnmi

# with path types
gnmic path --file nokia-state-combined.yang --types

# entering the interactive navigation prompt
gnmic path --file nokia-state-combined.yang --search
```

<script id="asciicast-319579" src="https://asciinema.org/a/319579.js" async></script>

[^1]: Nokia combined models can be found in [nokia/7x50_YangModels](https://github.com/nokia/7x50_YangModels/tree/master/latest_sros_20.5/nokia-combined) repo.


================================================
FILE: docs/cmd/processor.md
================================================
### Description

The `[processor | proc]` command allows running a set of event processor offline given an input of event messages.

If expects a file input (`--input`) containing a list of event messages and one or more processor(s) name(s) (`--name`) defined in the main config file.
This command will read the input file, validate the configured processors, apply them on the input event messages and print out the result.

### Usage

`gnmic [global-flags] processor [local-flags]`

### Local Flags

The processor command supports the following local flags:

#### name

The `[--name]` flag sets the list of processors names to apply to the input.

#### input

The `[--input]` flag is used to specify the path to a file containing a list of event messages (`stdin` can be specified by giving the `-` value).

#### delimiter

The `[--delimiter]` flag is used to set the delimiter string between event messages in the input file, defaults to `\n`.

#### output

The `[--output]` flag references an output name configured in the main config file. The command will out format the resulting messages according to the output config. This is mainly for outputs with `type: prometheus`

### Example

Config File

```yaml
outputs:
  out1:
    type: prometheus
    metric-prefix: "gnmic"
    strings-as-labels: true
    
processors:
  proc0:
    event-strings:
      value-names:
        - "^_"
      transforms:

  # processor name
  proc1:
    # processor type
    event-strings:
      value-names:
        - ".*"
      transforms:
        # strings function name
        - path-base:
            apply-on: "name"
  proc2:
    event-strings:
      tag-names:
        - "interface_name"
        - "subscription-name"
        - "source"
      transforms:
        # strings function name
        - to-upper:
            apply-on: "value"
        - to-upper:
            apply-on: "name"
  proc3:
    # processor type
    event-drop:
      condition: ".values | length == 0"
```

input File:

```json
[
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-packets": 351770
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-octets": 35284165
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-unicast-packets": 338985
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-broadcast-packets": 1218
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-multicast-packets": 5062
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-discarded-packets": 6377
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-error-packets": 128
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/in-fcs-error-packets": 0
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-packets": 568218
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-octets": 219527024
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-mirror-octets": 0
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-unicast-packets": 567532
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-broadcast-packets": 6
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-multicast-packets": 680
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-discarded-packets": 0
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-error-packets": 0
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/out-mirror-packets": 0
    }
  },
  {
    "name": "sub1",
    "timestamp": 1710890476202665500,
    "tags": {
      "interface_name": "mgmt0",
      "source": "clab-traps-srl1",
      "subscription-name": "sub1"
    },
    "values": {
      "/interface/statistics/carrier-transitions": 1
    }
  }
]
```

Command:

```shell
gnmic processor --input /path/to/event_msg.txt --delimiter "\n###" --name proc1,proc2,proc3 --output out1
```

Output:

```text
# HELP gnmic_in_packets gNMIc generated metric
# TYPE gnmic_in_packets untyped
gnmic_in_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 351770
# HELP gnmic_in_octets gNMIc generated metric
# TYPE gnmic_in_octets untyped
gnmic_in_octets{subscription_name="sub1",interface_name="mgmt0",source="clab-traps-srl1"} 3.5284165e+07
# HELP gnmic_in_unicast_packets gNMIc generated metric
# TYPE gnmic_in_unicast_packets untyped
gnmic_in_unicast_packets{subscription_name="sub1",interface_name="mgmt0",source="clab-traps-srl1"} 338985
# HELP gnmic_in_broadcast_packets gNMIc generated metric
# TYPE gnmic_in_broadcast_packets untyped
gnmic_in_broadcast_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 1218
# HELP gnmic_in_multicast_packets gNMIc generated metric
# TYPE gnmic_in_multicast_packets untyped
gnmic_in_multicast_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 5062
# HELP gnmic_in_discarded_packets gNMIc generated metric
# TYPE gnmic_in_discarded_packets untyped
gnmic_in_discarded_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 6377
# HELP gnmic_in_error_packets gNMIc generated metric
# TYPE gnmic_in_error_packets untyped
gnmic_in_error_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 128
# HELP gnmic_in_fcs_error_packets gNMIc generated metric
# TYPE gnmic_in_fcs_error_packets untyped
gnmic_in_fcs_error_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 0
# HELP gnmic_out_packets gNMIc generated metric
# TYPE gnmic_out_packets untyped
gnmic_out_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 568218
# HELP gnmic_out_octets gNMIc generated metric
# TYPE gnmic_out_octets untyped
gnmic_out_octets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 2.19527024e+08
# HELP gnmic_out_mirror_octets gNMIc generated metric
# TYPE gnmic_out_mirror_octets untyped
gnmic_out_mirror_octets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 0
# HELP gnmic_out_unicast_packets gNMIc generated metric
# TYPE gnmic_out_unicast_packets untyped
gnmic_out_unicast_packets{subscription_name="sub1",interface_name="mgmt0",source="clab-traps-srl1"} 567532
# HELP gnmic_out_broadcast_packets gNMIc generated metric
# TYPE gnmic_out_broadcast_packets untyped
gnmic_out_broadcast_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 6
# HELP gnmic_out_multicast_packets gNMIc generated metric
# TYPE gnmic_out_multicast_packets untyped
gnmic_out_multicast_packets{source="clab-traps-srl1",subscription_name="sub1",interface_name="mgmt0"} 680
# HELP gnmic_out_discarded_packets gNMIc generated metric
# TYPE gnmic_out_discarded_packets untyped
gnmic_out_discarded_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 0
# HELP gnmic_out_error_packets gNMIc generated metric
# TYPE gnmic_out_error_packets untyped
gnmic_out_error_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 0
# HELP gnmic_out_mirror_packets gNMIc generated metric
# TYPE gnmic_out_mirror_packets untyped
gnmic_out_mirror_packets{interface_name="mgmt0",source="clab-traps-srl1",subscription_name="sub1"} 0
# HELP gnmic_carrier_transitions gNMIc generated metric
# TYPE gnmic_carrier_transitions untyped
gnmic_carrier_transitions{subscription_name="sub1",interface_name="mgmt0",source="clab-traps-srl1"} 1
```


================================================
FILE: docs/cmd/prompt.md
================================================
## Description
The `prompt` command starts `gnmic` in an interactive prompt mode with the following auto-completion features:

* All `gnmic` [commands names and their flags are suggested](../user_guide/prompt_suggestions.md#commands-and-flags-suggestions).
* Values for the flags that rely on YANG-defined data (like `--path`, `--prefix`, `--model`,...) will be dynamically suggested, we call this feature [YANG-completions](../user_guide/prompt_suggestions.md#yang-completions).  
The auto-completions are generated from the YANG modules d with the `--file` and `--dir` flags.
* Flags with the fixed set of values (`--format`, `--encoding`, ...) will get their [values suggested](../user_guide/prompt_suggestions.md#enumeration-suggestions).
* Flags that require a [file path value will auto-suggest](../user_guide/prompt_suggestions.md#file-path-completions) the available files as the user types.


### Usage

`gnmic [global-flags] prompt [local-flags]`

### Flags

#### description-with-prefix
When set, the description of the path elements in the suggestion box will contain module's prefix.

#### description-with-types
When set, the description of the path elements in the suggestion box will contain element's type information.

#### max-suggestions
The `--max-suggestions` flag sets the number of lines that the suggestion box will display without scrolling.

Defaults to 10. Note, the terminal height might limit the number of lines in the suggestions box. 

#### suggest-all-flags
The `--suggest-all-flags` makes `gnmic` prompt suggest both global and local flags for a sub-command.

The default behavior (when this flag is not set) is to suggest __only__ local flags for any typed sub-command.

#### suggest-with-origin
The `--suggest-with-origin` flag prepends the suggested path with the module name to which this path belongs.

The path becomes rendered as `<module_name>:/<suggested-container>`. The module name will be used as the [origin](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) of the gNMI path.

#### suggestions-bg-color
The `--suggestions-bg-color` flag sets the background color of the left part of the suggestion box.

Defaults to dark blue.

#### description-bg-color
The `--description-bg-color` flag sets the background color of the right part of the suggestion box.

Defaults to dark gray.

#### prefix-color
The `--prefix-color` flag sets the gnmic prompt prefix color `gnmic> `.

Defaults to dark blue.

### Examples
The detailed explanation of the prompt command the the YANG-completions is provided on the [Prompt mode and auto-suggestions](../user_guide/prompt_suggestions.md) page.


================================================
FILE: docs/cmd/proxy.md
================================================
### Description

The `[proxy]` command start a gNMI proxy server. That relays gNMI messages to know targets (either configured or discovered).

`gNMIc` proxy relays `Get`, `Set` and `Subscribe` RPCs but not `Capabilities`.

To designate the target of an RPC, the `Prefix.Target` field within the RPC request message should be utilized. This field is versatile, accepting a single target, a comma-separated list of targets, or the wildcard character `*` for broader targeting.

Here are the key points regarding target specification:

- The target can be set to a target name or a comma-separated list of targets.
- Setting the target to `*` implies the selection of all known targets.
- If the Prefix.Target field is not explicitly set, gNMIc defaults to treating it as if `*` were specified, thus applying the action to all known targets.

gNMIc optimizes resource usage by reusing existing gNMI client instances whenever possible. If an appropriate gNMI client does not already exist, gNMIc will create a new instance as required.

### Usage

`gnmic [global-flags] proxy`

### Configuration

The Proxy behavior is controlled using the `gnmi-server` section of the main config file:

```yaml
gnmi-server:
  # the address the gNMI server will listen to
  address: :57400
  # tls config
  tls:
    # string, path to the CA certificate file,
    # this certificate is used to verify the clients certificates.
    ca-file:
    # string, server certificate file.
    cert-file:
    # string, server key file.
    key-file:
    # string, one of `"", "request", "require", "verify-if-given", or "require-verify" 
    #  - request:         The server requests a certificate from the client but does not 
    #                     require the client to send a certificate. 
    #                     If the client sends a certificate, it is not required to be valid.
    #  - require:         The server requires the client to send a certificate and does not 
    #                     fail if the client certificate is not valid.
    #  - verify-if-given: The server requests a certificate, 
    #                     does not fail if no certificate is sent. 
    #                     If a certificate is sent it is required to be valid.
    #  - require-verify:  The server requires the client to send a valid certificate.
    #
    # if no ca-file is present, `client-auth` defaults to ""`
    # if a ca-file is set, `client-auth` defaults to "require-verify"`
    client-auth: ""
  max-subscriptions: 64
  # maximum number of active Get/Set RPCs
  max-unary-rpc: 64
  # defines the maximum msg size (in bytes) the server can receive, 
  # defaults to 4MB
  max-recv-msg-size:
  # defines the maximum msg size (in bytes) the server can send,
  # default to MaxInt32 (2147483647 bytes or 2.147483647 Gb)
  max-send-msg-size:
  # defines the maximum number of streams per streaming RPC.
  max-concurrent-streams:
  # defines the TCP keepalive tiem and interval for client connections, 
  # if unset it is enabled based on the OS. If negative it is disabled.
  tcp-keepalive: 
  # set keepalive and max-age parameters on the server-side.
  keepalive:
    # MaxConnectionIdle is a duration for the amount of time after which an
    # idle connection would be closed by sending a GoAway. Idleness duration is
    # defined since the most recent time the number of outstanding RPCs became
    # zero or the connection establishment.
    # The current default value is infinity.
    max-connection-idle:
    # MaxConnectionAge is a duration for the maximum amount of time a
    # connection may exist before it will be closed by sending a GoAway. A
    # random jitter of +/-10% will be added to MaxConnectionAge to spread out
    # connection storms.
    # The current default value is infinity.
    max-connection-age:
    # MaxConnectionAgeGrace is an additive period after MaxConnectionAge after
    # which the connection will be forcibly closed.
    # The current default value is infinity.
    max-connection-age-grace:
    # After a duration of this time if the server doesn't see any activity it
    # pings the client to see if the transport is still alive.
    # If set below 1s, a minimum value of 1s will be used instead.
    # The current default value is 2 hours.
    time: 120m
    # After having pinged for keepalive check, the server waits for a duration
    # of Timeout and if no activity is seen even after that the connection is
    # closed.
    # The current default value is 20 seconds.
    timeout: 20s
  # defines the minimum allowed sample interval, this value is used when the received sample-interval 
  # is greater than zero but lower than this minimum value.
  min-sample-interval: 1ms
  # defines the default sample interval, 
  # this value is used when the received sample-interval is zero within a stream/sample subscription.
  default-sample-interval: 1s
  # defines the minimum heartbeat-interval
  # this value is used when the received heartbeat-interval is greater than zero but
  # lower than this minimum value
  min-heartbeat-interval: 1s
  # enables the collection of Prometheus gRPC server metrics
  enable-metrics: false
  # enable additional debug logs
  debug: false
  # Enables Consul service registration
  service-registration:
    # Consul server address, default to localhost:8500
    address:
    # Consul Data center, defaults to dc1
    datacenter: 
    # Consul username, to be used as part of HTTP basicAuth
    username:
    # Consul password, to be used as part of HTTP basicAuth
    password:
    # Consul Token, is used to provide a per-request ACL token 
    # which overrides the agent's default token
    token:
    # gnmi server service check interval, only TTL Consul check is enabled
    # defaults to 5s
    check-interval:
    # Maximum number of failed checks before the service is deleted by Consul
    # defaults to 3
    max-fail:
    # Consul service name
    name:
    # List of tags to be added to the service registration, 
    # if available, the instance-name and cluster-name will be added as tags,
    # in the format: gnmic-instance=$instance-name and gnmic-cluster=$cluster-name
    tags:
```

### Example

#### simple proxy

This config start gNMIc as a gNMI proxy serving 2 targets `router1` and `router2`

```yaml
gnmi-server:
  address: :57401

targets:
  router1:
    skip-verify: true
  router2:
    skip-verify: true
```

```shell
gnmic --config gnmic.yaml proxy
```

#### proxy with target discovery

```yaml
gnmi-server:
  address: :57401

loader:
  type: file
  path: targets.yaml
```

```shell
gnmic --config gnmic.yaml proxy
```

#### proxy with service registration

```yaml
gnmi-server:
  address: gnmi-proxy-address:57401
  service-registration:
    name: proxy
    address: consul-server:8500

loader:
  type: file
  path: targets.yaml
```

```shell
gnmic --config gnmic.yaml proxy
```


================================================
FILE: docs/cmd/set.md
================================================
## Description

The `set` command represents the [gNMI Set RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L62).

It is used to send a [Set Request](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L339) to the specified target(s) and expects one [Set Response](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L356) per target.

Set RPC allows the client to [modify the state](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#34-modifying-state) of data on the target. The data specified referenced by a path can be [updated, replaced or deleted](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#343-transactions).

!!! note
    It is possible to combine `update`, `replace` and `delete` in a single `gnmic set` command.

## Usage

`gnmic [global-flags] set [local-flags]`

The Set Request can be any of (or a combination of) update, replace or/and delete operations.

## Flags

### prefix

The `--prefix` flag sets a common [prefix](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#241-path-prefixes) to all paths specified using the local `--path` flag. Defaults to `""`.

If a user needs to provide [origin](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) information to the Path message, the following pattern should be used for the path string: `"origin:path"`:

!!! note
    The path after the origin value has to start with a `/`

```bash
gnmic set --update "openconfig-interfaces:/interfaces/interface:::<type>:::<value>"
```

### target

With the optional `[--target]` flag it is possible to supply the [path target](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#2221-path-target) information in the prefix field of a SetRequest message.

### dry-run

The `--dry-run` flag allow to run a Set request without sending it to the targets.
This is useful while developing templated Set requests.

### delete

The `--delete` flag allows creating a [SetRequest.Delete](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L337) as part of teh SetRequest message.

### replace

The `--replace` flag allows creating a [SetRequest.Replace](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L338) as part of a SetRequest message.
It is expected to be in the format `$path:::$type:::$value`, where `$path` is the gNMI path of the object to replace, `$type` is the type of the value and `$value` is the replacement value.

### update

The `--update` flag allows creating a [SetRequest.Update](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L339) as part of a SetRequest message.
It is expected to be in the format `$path:::$type:::$value`, where `$path` is the gNMI path of the object to update, `$type` is the type of the value and `$value` is the update value.

### replace-path and replace-value

The `--replace-path` and `--replace-value` flags are equivalent to the `--replace` flag, where the path and value are split and the type is deduced from the `[-e | --encoding]` global flag.

### update-path and update-value

The `--update-path` and `--update-value` flags are equivalent to the `--update` flag, where the path and value are split and the type is deduced from the `[-e | --encoding]` global flag.

### replace-path and replace-file

The `--replace-path` and `--replace-file` flags are equivalent to the `--replace` flag, where the path and value are split and the type is deduced from the `[-e | --encoding]` global flag.

### update-path and update-file

The `--update-path` and `--update-file` flags are equivalent to the `--update` flag, where the path and value are split and the type is deduced from the `[-e | --encoding]` global flag.

### replace-cli

The `--replace-cli` flag allows setting a [SetRequest.Replace](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L338) as part of a SetRequest message.
It expects a single CLI command which will form the value path of the Replace, the path will be set to the CLI origin `cli`.

### replace-cli-file

The `--replace-cli` flag allows setting a [SetRequest.Replace](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L338) as part of a SetRequest message.
It expects a file containing one or multiple CLI commands which will form the value path of the Replace, the path will be set to the CLI origin `cli`.

### update-cli

The `--update-cli` flag allows setting a [SetRequest.Update](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L339) as part of a SetRequest message.
It expects a single CLI command which will form the value path of the Replace, the path will be set to the CLI origin `cli`.

### update-cli-file

The `--update-cli` flag allows setting a [SetRequest.Update](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L339) as part of a SetRequest message.
It expects a file containing one or multiple CLI commands which will form the value path of the Replace, the path will be set to the CLI origin `cli`.

### request-file and request-vars

See [this section](#templated-set-request-file) below.

### commit-id

The `--commit-id` flag sets the commit ID when the client needs to perform a commit confirmed set request as per: https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-commit-confirmed.md

### commit-request

The `--commit-request` flag is used together with the `--commit-id` flag to set the commit action to `Request`, essentially starting a commit request.

### commit-confirm

The `--commit-confirm` flag is used together with the `--commit-id` flag to confirm an already started commit confirmed transaction.

### commit-cancel

The `--commit-cancel` flag is used together with the `--commit-id` flag to cancel an already started commit confirmed transaction.

### rollback-duration

The `--rollback-duration` flag is used together with the `--commit-id` flag to set the rollback duration of a commit confirmed transaction either at creation time or before the previous commit rollback expires.

## Update Request

There are several ways to perform an update operation with gNMI Set RPC:

#### 1. in-line update, implicit type

Using both `--update-path` and `--update-value` flags, a user can update a value for a given path.

```bash
gnmic set --update-path /configure/system/name --update-value router1

gnmic set --update-path /configure/router[router-name=Base]/interface[interface-name=system]/admin-state \
          --update-value enable
```

The above 2 updates can be combined in the same CLI command:

```bash
gnmic set --update-path /configure/system/name \
          --update-value router1 \
          --update-path /configure/router[router-name=Base]/interface[interface-name=system]/admin-state \
          --update-value enable
```

#### 2. in-line update, explicit type

Using the update flag `--update`, one can specify the path, value type and value in a single parameter using a delimiter `--delimiter`. Delimiter string defaults to `":::"`.

Supported types: json, json_ietf, string, int, uint, bool, decimal, float, bytes, ascii.

```bash
# path:::value-type:::value
gnmic set --update /configure/system/name:::json:::router1

gnmic set --update /configure/router[router-name=Base]/interface[interface-name=system]/admin-state:::json:::enable

gnmic set --update /configure/router[router-name=Base]/interface[interface-name=system]:::json:::'{"admin-state":"enable"}'
```

#### 3. update with a value from JSON or YAML file

It is also possible to specify the values from a local JSON or YAML file using `--update-file` flag for the value and `--update-path` for the path.

In which case the value encoding will be determined by the global flag `[ -e | --encoding ]`, both `JSON` and `JSON_IETF` are supported

The file's format is identified by its extension, json: `.json` and yaml `.yaml` or `.yml`.

=== "interface.json"
    ```bash
    {
        "admin-state": "enable",
        "ipv4": {
            "primary": {
                "address": "1.1.1.1",
                "prefix-length": 32
            }
        }
    }
    ```
    ``` bash
    gnmic set --update-path /configure/router[router-name=Base]/interface[interface-name=system] \
              --update-file interface.json
    ```

=== "interface.yml"

    ```bash
    "admin-state": enable
    "ipv4":
    "primary":
        "address": 1.1.1.1
        "prefix-length": 32
    ```
    ``` bash
    gnmic set --update-path /configure/router[router-name=Base]/interface[interface-name=system] \
              --update-file interface.yml
    ```

## Replace Request

There are 3 main ways to specify a replace operation:

#### 1. in-line replace, implicit type

Using both `--replace-path` and `--replace-value` flags, a user can replace a value for a given path. The type of the value is implicitly set to `JSON`:

```bash
gnmic set --replace-path /configure/system/name --replace-value router1
```

```bash
gnmic set --replace-path /configure/router[router-name=Base]/interface[interface-name=system]/admin-state \
          --replace-value enable
```

The above 2 commands can be packed in the same CLI command:

```bash
gnmic set --replace-path /configure/system/name \
          --replace-value router1 \
          --replace-path /configure/router[router-name=Base]/interface[interface-name=system]/admin-state \
          --replace-value enable
```

#### 2. in-line replace, explicit type

Using the replace flag `--replace`, you can specify the path, value type and value in a single parameter using a delimiter `--delimiter`. Delimiter string defaults to `":::"`.

Supported types: json, json_ietf, string, int, uint, bool, decimal, float, bytes, ascii.

```bash
gnmic set --replace /configure/system/name:::json:::router1
```

```bash
gnmic set --replace /configure/router[router-name=Base]/interface[interface-name=system]/admin-state:::json:::enable
```

#### 3. replace with a value from JSON or YAML file

It is also possible to specify the values from a local JSON or YAML file using flag `--replace-file` for the value and `--replace-path` for the path.

In which case the value encoding will be determined by the global flag `[ -e | --encoding ]`, both `JSON` and `JSON_IETF` are supported

The file is identified by its extension, json: `.json` and yaml `.yaml` or `.yml`.

=== "interface.json"
    ```bash
    {
        "admin-state": "enable",
        "ipv4": {
            "primary": {
                "address": "1.1.1.1",
                "prefix-length": 32
            }
        }
    }
    ```
=== "interface.yml"
    ```bash
    "admin-state": enable
    "ipv4":
    "primary":
        "address": 1.1.1.1
        "prefix-length": 32
    ```

Then refer to the file with `--replace-file` flag

``` bash
gnmic set --replace-path /configure/router[router-name=Base]/interface[interface-name=system] \
          --replace-file interface.json
```

## Delete Request

A deletion operation within the Set RPC is specified using the delete flag `--delete`.

It takes an XPATH pointing to the config node to be deleted:

```bash
gnmic set --delete "/configure/router[router-name=Base]/interface[interface-name=dummy_interface]"
```

## Templated Set Request file

A Set Request can also be built based on one or multiple templates and (optionally) a set of variables.

The variables allow to generate a Set Request file on per target basis.

If no variable file is found, the execution continues and the template is assumed to be a static string.

Each template specified with the flag `--request-file` is rendered against the variables defined in the file set with `--request-vars`.
Each template results in a single gNMI Set Request.

```bash
gnmic set --request-file <template1> --request-file <template2> --request-vars <vars_file>
```

### Template Format

The rendered template data can be a `JSON` or `YAML` valid string.

It has 3 sections, `updates`, `replaces` and `deletes`.

In each of the `updates` and `replaces`, a `path`, a `value` and an `encoding` can be configured.

If not specified, `path` defaults to `/`, while `encoding` defaults to the value set with `--encoding` flag.

`updates` and `replaces` result in a set of gNMI Set Updates in the Set RPC, `deletes` result in a set of gNMI paths to be deleted.

The `value` can be any arbitrary data format that the target accepts, it will be encoded based on the value of "encoding".
=== "JSON"
    ```json
    {
      "updates": [
          {
              "path": "/interface[name=ethernet-1/1]",
              "value": {
                  "admin-state": "enable",
                  "description": "to_spine1"
               },
               "encoding": "json_ietf"
          },
          {
              "path": "/interface[name=ethernet-1/2]",
              "value": {
                  "admin-state": "enable",
                  "description": "to_spine2"
               },
               "encoding": "json_ietf"
          }
      ],
      "replaces": [
          {
              "path": "/interface[name=ethernet-1/3]",
              "value": {
                  "admin-state": "enable",
                  "description": "to_spine3"
               }
          },
           {
              "path": "/interface[name=ethernet-1/4]",
              "value": {
                  "admin-state": "enable",
                  "description": "to_spine4"
               }
          }
      ],
      "deletes" : [
          "/interface[name=ethernet-1/5]",
          "/interface[name=ethernet-1/6]"
      ]
    }
    ```
=== "YAML"
    ```yaml
    updates:
      - path: "/interface[name=ethernet-1/1]"
        value:
          admin-state: enable
          description: "to_spine1"
        encoding: "json_ietf"
      - path: "/interface[name=ethernet-1/2]"
        value:
          admin-state: enable
          description: "to_spine2"
        encoding: "json_ietf"
    replaces:
      - path: "/interface[name=ethernet-1/3]"
        value:
          admin-state: enable
          description: "to_spine3"
      - path: "/interface[name=ethernet-1/4]"
        value:
          admin-state: enable
          description: "to_spine4"
    deletes:
      - "/interface[name=ethernet-1/5]"
      - "/interface[name=ethernet-1/6]"
    ```

### Per Target Template Variables

The file `--request-file` can be written as a [Go Text template](https://golang.org/pkg/text/template/).

The parsed template is loaded with additional functions from [gomplate](https://docs.gomplate.ca/).

`gnmic` generates one gNMI Set request per target.

The template will be rendered using variables read from the file `--request-vars`. 
Just like the template file, the variables file can either be a `JSON` or `YAML` formatted file.

If the flag `--request-vars` is not set, `gnmic` looks for a file with the same path, name and **extension** as the `request-file`, appended with `_vars`.

Within the template, the variables defined in the `--request-vars` file are accessible using the `.Vars` notation, while the target name is accessible using the `.TargetName` notation.

Example request template:

```yaml
replaces:
{{ $target := index .Vars .TargetName }}
{{- range $interface := index $target "interfaces" }}
  - path: "/interface[name={{ index $interface "name" }}]"
    encoding: "json_ietf"
    value: 
      admin-state: {{ index $interface "admin-state" | default "disable" }}
      description: {{ index $interface "description" | default "" }}
    {{- range $index, $subinterface := index $interface "subinterfaces" }}
      subinterface:
        - index: {{ $index }}
          admin-state: {{ index $subinterface "admin-state" | default "disable" }}
          {{- if has $subinterface "ipv4-address" }}
          ipv4:
            address:
              - ip-prefix: {{ index $subinterface "ipv4-address" | toString }}
          {{- end }}
          {{- if has $subinterface "ipv6-address" }}
          ipv6:
            address:
              - ip-prefix: {{ index $subinterface "ipv6-address" | toString }}
          {{- end }}
    {{- end }}
{{- end }}
```

The below variables file defines the input for 3 leafs:

```yaml
leaf1:57400:
  interfaces:
    - name: ethernet-1/1
      admin-state: "enable"
      description: "leaf1_to_spine1"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.78.1/30
    - name: ethernet-1/2
      admin-state: "enable"
      description: "leaf1_to_spine2"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.79.1/30

leaf2:57400:
  interfaces:
    - name: ethernet-1/1
      admin-state: "enable"
      description: "leaf2_to_spine1"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.88.1/30
    - name: ethernet-1/2
      admin-state: "enable"
      description: "leaf2_to_spine2"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.89.1/30
          
leaf3:57400:
  interfaces:
    - name: ethernet-1/1
      admin-state: "enable"
      description: "leaf3_to_spine1"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.98.1/30
    - name: ethernet-1/2
      admin-state: "enable"
      description: "leaf3_to_spine2"
      subinterfaces:
        - admin-state: enable
          ipv4-address: 192.168.99.1/30
```

Result Request file per target:

=== "leaf1"
    ```yaml
    updates:
      - path: /interface[name=ethernet-1/1]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf1_to_spine1
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.78.1/30
      - path: /interface[name=ethernet-1/2]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf1_to_spine2
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.79.1/30
    ```
=== "leaf2"
    ```yaml
    updates:
      - path: /interface[name=ethernet-1/1]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf2_to_spine1
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.88.1/30
      - path: /interface[name=ethernet-1/2]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf2_to_spine2
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.89.1/30
    ```
=== "leaf3"
    ```yaml
    updates:
      - path: /interface[name=ethernet-1/1]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf3_to_spine1
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.98.1/30
      - path: /interface[name=ethernet-1/2]
        encoding: "json_ietf"
        value: 
          admin-state: enable
          description: leaf3_to_spine2
          subinterface:
            - index: 0
              admin-state: enable
              ipv4:
                address:
                  - ip-prefix: 192.168.99.1/30
    ```

## Examples

### 1. update

#### in-line value

```bash
gnmic -a <ip:port> set --update-path /configure/system/name \
                       --update-value <system_name>
```

#### value from JSON file

```bash
cat jsonFile.json
{"name": "router1"}

gnmic -a <ip:port> set --update-path /configure/system \
                       --update-file <jsonFile.json>
```

```bash
echo '{"name": "router1"}' | gnmic -a <ip:port> set \
                             --update-path /configure/system \
                             --update-file -
```

#### specify value type

```bash
gnmic -a <ip:port> set --update /configure/system/name:::json:::router1
gnmic -a <ip:port> set --update /configure/system/name@json@router1 \
                       --delimiter @
```

### 2. replace

```bash
cat interface.json
{"address": "1.1.1.1", "prefix-length": 32}

gnmic -a <ip:port> --insecure \
      set --replace-path /configure/router[router-name=Base]/interface[interface-name=interface1]/ipv4/primary \
          --replace-file interface.json
```

```bash
echo '{"address": "1.1.1.1", "prefix-length": 32}' | gnmic -a <ip:port> --insecure \
      set --replace-path /configure/router[router-name=Base]/interface[interface-name=interface1]/ipv4/primary \
          --replace-file -
```

### 3. delete

```bash
gnmic -a <ip:port> --insecure set --delete /configure/router[router-name=Base]/interface[interface-name=interface1]
```

<script
id="asciicast-319562" src="https://asciinema.org/a/319562.js" async>
</script>


================================================
FILE: docs/cmd/subscribe.md
================================================
### Description

The `[subscribe | sub]` command represents the [gNMI Subscribe RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L68).

It is used to send a [Subscribe Request](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L208) to the specified target(s) and expects one or multiple [Subscribe Response](https://github.com/openconfig/gnmi/blob/master/proto/gnmi/gnmi.proto#L232)

### Usage

`gnmic [global-flags] subscribe [local-flags]`

### Local Flags

The subscribe command supports the following local flags:

#### prefix

The `[--prefix]` flag sets a common [prefix](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#241-path-prefixes) to all paths specified using the local `--path` flag. Defaults to `""`.

#### path

The path flag `[--path]` is used to specify the [path(s)](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) to which the client wants to subscribe.

Multiple paths can be specified by using repeated `--path` flags:

```bash
gnmic sub --path "/state/ports[port-id=*]" \
          --path "/state/router[router-name=*]/interface[interface-name=*]"
```

If a user needs to provide [origin](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#222-paths) information to the Path message, the following pattern should be used for the path string: `"origin:path"`:

!!! note
    The path after the origin value has to start with a `/`

```bash
gnmic sub --path "openconfig-interfaces:/interfaces/interface"
```

#### target

With the optional `[--target]` flag it is possible to supply the [path target](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#2221-path-target) information in the prefix field of the SubscriptionList message.

#### set-target

The `[--set-target]` flag is used to set the SubscribeRequest Prefix target value to the configured target name stripped of the port number.

#### model

The `[--model]` flag is used to specify the schema definition modules that the target should use when extracting the data to stream back.

#### qos

The `[--qos]` flag specifies the packet marking that is to be used for the responses to the subscription request. Default marking is set to `20`. If qos marking is not supported by a target the marking can be disabled by setting the value to `0`.

#### mode

The `[--mode]` mode flag specifies the mode of subscription to be created.

This may be one of:
[ONCE](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#35151-once-subscriptions), [STREAM](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#35152-stream-subscriptions) or [POLL](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#35153-poll-subscriptions).

It is case insensitive and defaults to `STREAM`.

#### stream subscription mode

The `[--stream-mode]` flag is used to specify the stream subscription mode.

This may be one of: [ON_CHANGE, SAMPLE or TARGET_DEFINED](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-specification.md#35152-stream-subscriptions)

This flag applies only if `--mode` is set to `STREAM`. It is case insensitive and defaults to `SAMPLE`.

#### sample interval

The `[--sample-interval]` flag is used to specify the sample interval to be used by the target to send samples to the client.

This flag applies only in case `--mode` is set to `STREAM` and `--stream-mode` is set to `SAMPLE`.

Valid formats: `1s, 1m30s, 1h`. Defaults to `0s` which is the lowest interval supported by a target.

#### heartbeat interval

The `[--heartbeat-interval]` flag is used to specify the server heartbeat interval.

The heartbeat interval value can be specified along with `ON_CHANGE` or `SAMPLE` stream subscriptions modes.

* `ON_CHANGE`: The value of the data item(s) MUST be re-sent once per heartbeat interval regardless of whether the value has changed or not.
* `SAMPLE`: The target MUST generate one telemetry update per heartbeat interval, regardless of whether the `--suppress-redundant` flag is set to true.

#### quiet

With `[--quiet]` flag set `gnmic` will not output subscription responses to `stdout`. The `--quiet` flag is useful when `gnmic` exports the received data to one of the export providers.

#### suppress redundant

When the `[--suppress-redundant]` flag is set to true, the target SHOULD NOT generate a telemetry update message unless the value of the path being reported on has changed since the last update was generated.

This flag applies only in case `--mode` is set to `STREAM` and `--stream-mode` is set to `SAMPLE`.

#### updates only

When the `[--updates-only]` flag is set to true, the target MUST not transmit the current state of the paths that the client has subscribed to, but rather should send only updates to them.

#### name

The `[--name]` flag is used to trigger one or multiple subscriptions already defined in the configuration file see [defining subscriptions](../user_guide/subscriptions.md)

#### output

The `[--output]` flag is used to select one or multiple output already defined in the configuration file. 

Outputs defined under target take precedence over this flag, see [defining outputs](../user_guide/outputs/output_intro.md) and [defining targets](../user_guide/multi_targets)

#### watch-config

The `[--watch-config]` flag is used to enable automatic target loading from the configuration source at runtime. 

On each configuration change, gnmic reloads the list of targets, subscribes to new targets and/or deletes subscriptions to the deleted ones.

Only addition and deletion of targets are currently supported, changes in an existing target config are not possible.

#### backoff

The `[--backoff]` flag is used to specify a duration between consecutive subscription towards targets. It defaults to `0s`  meaning all subscription are started in parallel.

If a locker is configured, the backoff timer is set to `100ms` by default.

#### lock-retry

The `[--lock-retry]` flag is a duration used to set the wait time between consecutive lock attempts. Defaults to `5s`.

#### history-snapshot

The `[--history-snapshot]` flag sets the snapshot value in the subscribe request [gNMI History extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md).

The value can be either nanoseconds since Unix epoch or a date in RFC3339 format.

#### history-start

The `[--history-start]` flag sets the start value in the subscribe request Time Range [gNMI History extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md).

The value can be either nanoseconds since Unix epoch or a date in RFC3339 format.

#### history-end

The `[--history-end]` flag sets the end value in the subscribe request Time Range [gNMI History extension](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-history.md).

#### depth

The `[--depth]` flag set the gNMI extension depth value as defined [here](https://github.com/openconfig/reference/blob/master/rpc/gnmi/gnmi-depth.md)

### Examples

#### 1. streaming, target-defined, 10s interval

```bash
gnmic -a <ip:port> sub --path /state/port[port-id=*]/statistics
```

#### 2. streaming, sample, 30s interval

```bash
gnmic -a <ip:port> sub --path "/state/port[port-id=*]/statistics" \
                       --sample-interval 30s
```

#### 3. streaming, on-change, heartbeat interval 1min

```bash
gnmic -a <ip:port> sub --path "/state/port[port-id=*]/statistics" \
                       --stream-mode on-change \
                       --heartbeat-interval 1m
```

#### 4. once subscription

```bash
gnmic -a <ip:port> sub --path "/state/port[port-id=*]/statistics" \
                       --mode once
```

<script
id="asciicast-319608" src="https://asciinema.org/a/319608.js" async>
</script>


================================================
FILE: docs/deployments/clusters/containerlab/cluster_with_gnmi_server_and_prometheus_output.md
================================================
The purpose of this deployment is to achieve __redundancy__, __high-availability__ and __data aggregation__ via clustering.

This deployment example includes:

- A 3 instances [gNMIc cluster](../../../user_guide/HA.md),
- A standalone `gNMIc` instance.
- A [Prometheus](https://prometheus.io/) Server
- A [Grafana](https://grafana.com/docs/) Server
- A [Consul](https://www.consul.io/docs/intro) Server

The leader election and target distribution is done with the help of a [Consul server](https://www.consul.io/docs/intro)

All members of the cluster expose a gNMI Server that the single gNMIc instance will use to aggregate the collected data.

The aggregation `gNMIc` instance exposes a Prometheus output that is registered in `Consul` and is discoverable by the Prometheus server.

The whole lab is pretty much self organising:

- The `gNMIc` cluster instances discover the targets dynamically using a [Docker Loader](../../../user_guide/targets/target_discovery/docker_discovery.md)
- The `gNMIc` standalone instance, discovers the cluster instance using a [Consul Loader](../../../user_guide/targets/target_discovery/consul_discovery.md)
- The Prometheus server discovers gNMIc's Prometheus output using [Consul Service Discovery](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config)

<div class="mxgraph" style="max-width:100%;border:1px solid transparent;margin:0 auto; display:block;" data-mxgraph="{&quot;page&quot;:1,&quot;zoom&quot;:1.4,&quot;highlight&quot;:&quot;#0000ff&quot;,&quot;nav&quot;:true,&quot;check-visible-state&quot;:true,&quot;resize&quot;:true,&quot;url&quot;:&quot;https://raw.githubusercontent.com/openconfig/gnmic/diagrams/diagrams/clab_cluster_gnmi_server.drawio&quot;}"></div>

<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/hellt/drawio-js@main/embed2.js?&fetch=https%3A%2F%2Fraw.githubusercontent.com%2Fkarimra%2Fgnmic%2Fdiagrams%2Fclab_cluster_gnmi_server.drawio" async></script>



Deployment files:

- [containerlab](https://github.com/openconfig/gnmic/blob/main/examples/deployments/2.clusters/4.gnmi-server/containerlab/gnmi-server.clab.yaml)
- [gNMIc cluster config](https://github.com/openconfig/gnmic/blob/main/examples/deployments/2.clusters/4.gnmi-server/containerlab/gnmic.yaml)
- [gNMIc aggregator config](https://github.com/openconfig/gnmic/blob/main/examples/deployments/2.clusters/4.gnmi-server/containerlab/gnmic-agg.yaml)
- [Prometheus config](https://github.com/openconfig/gnmic/blob/main/examples/deployments/2.clusters/4.gnmi-server/containerlab/prometheus/prometheus.yaml)
- [Grafana datasource](https://github.com/openconfig/gnmic/blob/main/examples/deployments/2.clusters/4.gnmi-server/containerlab/grafana/datasources/datasource.yaml)

Deploy it with:

```bash
git clone https://github.com/openconfig/gnmic.git
cd gnmic/examples/deployments/2.clusters/4.gnmi-server/containerlab
sudo clab deploy -t gnmi-server.clab.yaml
```

```text
+----+-------------------------+--------------+------------------------------+-------+-------+---------+-----------------+-----------------------+
| #  |          Name           | Container ID |            Image             | Kind  | Group |  State  |  IPv4 Address   |     IPv6 Address      |
+----+-------------------------+--------------+------------------------------+-------+-------+---------+-----------------+-----------------------+
|  1 | clab-lab24-agg-gnmic    | 2e9cc2821b07 | ghcr.io/openconfig/gnmic:latest | linux |       | running | 172.20.20.7/24  | 2001:172:20:20::7/64  |
|  2 | clab-lab24-consul-agent | c17d31d5f41b | consul:latest                | linux |       | running | 172.20.20.2/24  | 2001:172:20:20::2/64  |
|  3 | clab-lab24-gnmic1       | 3d56e09955f2 | ghcr.io/openconfig/gnmic:latest | linux |       | running | 172.20.20.4/24  | 2001:172:20:20::4/64  |
|  4 | clab-lab24-gnmic2       | eba24dacea36 | ghcr.io/openconfig/gnmic:latest | linux |       | running | 172.20.20.3/24  | 2001:172:20:20::3/64  |
|  5 | clab-lab24-gnmic3       | caf473f500f6 | ghcr.io/openconfig/gnmic:latest | linux |       | running | 172.20.20.6/24  | 2001:172:20:20::6/64  |
|  6 | clab-lab24-grafana      | eaa224e62243 | grafana/grafana:latest       | linux |       | running | 172.20.20.8/24  | 2001:172:20:20::8/64  |
|  7 | clab-lab24-leaf1        | 6771dc8d3786 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.10/24 | 2001:172:20:20::a/64  |
|  8 | clab-lab24-leaf2        | 5cfb1cf68958 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.14/24 | 2001:172:20:20::e/64  |
|  9 | clab-lab24-leaf3        | c438f734e44d | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.19/24 | 2001:172:20:20::13/64 |
| 10 | clab-lab24-leaf4        | ae4321825a03 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.17/24 | 2001:172:20:20::11/64 |
| 11 | clab-lab24-leaf5        | ee7a520fd844 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.18/24 | 2001:172:20:20::12/64 |
| 12 | clab-lab24-leaf6        | 59c3c515ef35 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.9/24  | 2001:172:20:20::9/64  |
| 13 | clab-lab24-leaf7        | 111f858b19fd | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.22/24 | 2001:172:20:20::16/64 |
| 14 | clab-lab24-leaf8        | 0ecc69891eb4 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.20/24 | 2001:172:20:20::14/64 |
| 15 | clab-lab24-prometheus   | 357821ec726e | prom/prometheus:latest       | linux |       | running | 172.20.20.5/24  | 2001:172:20:20::5/64  |
| 16 | clab-lab24-spine1       | 0f5f6f6dc5fa | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.13/24 | 2001:172:20:20::d/64  |
| 17 | clab-lab24-spine2       | b718503d3b3f | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.15/24 | 2001:172:20:20::f/64  |
| 18 | clab-lab24-spine3       | e02f18d0e3ff | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.11/24 | 2001:172:20:20::b/64  |
| 19 | clab-lab24-spine4       | 3347cba3f277 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.12/24 | 2001:172:20:20::c/64  |
| 20 | clab-lab24-super-spine1 | 4abc7bcaf43c | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.16/24 | 2001:172:20:20::10/64 |
| 21 | clab-lab24-super-spine2 | 5b2f5f153d43 | ghcr.io/nokia/srlinux        | srl   |       | running | 172.20.20.21/24 | 2001:172:20:20::15/64 |
+----+-------------------------+--------------+------------------------------+-------+-------+---------+-----------------+-----------------------+
```
Check the [Prometheus Output](../../../user_guide/outputs/prometheus_output.md) and [gNMI Serv
Download .txt
gitextract_xxir9y9t/

├── .dockerignore
├── .github/
│   ├── dependabot.yml
│   └── workflows/
│       ├── close_state_issues.yml
│       ├── docs.yml
│       ├── lint.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── Dockerfile
├── LICENSE
├── README.md
├── cmd/
│   └── demo/
│       ├── getresponse.textproto
│       ├── setrequest.textproto
│       ├── setrequest2.textproto
│       └── subscriberesponses.textproto
├── config.json
├── config.toml
├── config.yaml
├── docs/
│   ├── CNAME
│   ├── basic_usage.md
│   ├── blog/
│   │   └── index.md
│   ├── changelog.md
│   ├── cmd/
│   │   ├── capabilities.md
│   │   ├── collector.md
│   │   ├── diff/
│   │   │   ├── diff.md
│   │   │   ├── diff_set_to_notifs.md
│   │   │   └── diff_setrequest.md
│   │   ├── generate/
│   │   │   ├── generate_path.md
│   │   │   └── generate_set_request.md
│   │   ├── generate.md
│   │   ├── get.md
│   │   ├── getset.md
│   │   ├── listen.md
│   │   ├── path.md
│   │   ├── processor.md
│   │   ├── prompt.md
│   │   ├── proxy.md
│   │   ├── set.md
│   │   └── subscribe.md
│   ├── deployments/
│   │   ├── clusters/
│   │   │   ├── containerlab/
│   │   │   │   ├── cluster_with_gnmi_server_and_prometheus_output.md
│   │   │   │   ├── cluster_with_influxdb_output.md
│   │   │   │   ├── cluster_with_nats_input_and_prometheus_output.md
│   │   │   │   └── cluster_with_prometheus_output.md
│   │   │   ├── docker-compose/
│   │   │   │   ├── cluster_with_influxdb_output.md
│   │   │   │   ├── cluster_with_nats_input_and_prometheus_output.md
│   │   │   │   └── cluster_with_prometheus_output.md
│   │   │   └── kubernetes/
│   │   │       └── cluster_with_prometheus_output.md
│   │   ├── deployments_intro.md
│   │   ├── pipelines/
│   │   │   └── docker-compose/
│   │   │       ├── forked_pipeline.md
│   │   │       ├── gnmic_cluster_nats_prometheus.md
│   │   │       ├── nats_influxdb.md
│   │   │       └── nats_prometheus.md
│   │   └── single-instance/
│   │       ├── containerlab/
│   │       │   ├── influxdb-output.md
│   │       │   ├── kafka-output.md
│   │       │   ├── multiple-outputs.md
│   │       │   ├── nats-output.md
│   │       │   ├── prometheus-output.md
│   │       │   └── prometheus-remote-write-output.md
│   │       └── docker-compose/
│   │           ├── influxdb-output.md
│   │           ├── kafka-output.md
│   │           ├── multiple-outputs.md
│   │           ├── nats-output.md
│   │           └── prometheus-output.md
│   ├── global_flags.md
│   ├── index.md
│   ├── install.md
│   ├── stylesheets/
│   │   └── extra.css
│   └── user_guide/
│       ├── HA.md
│       ├── actions/
│       │   └── actions.md
│       ├── api/
│       │   ├── api_intro.md
│       │   ├── cluster.md
│       │   ├── configuration.md
│       │   ├── other.md
│       │   └── targets.md
│       ├── caching.md
│       ├── collector/
│       │   ├── collector_api.md
│       │   ├── collector_configuration.md
│       │   └── collector_intro.md
│       ├── configuration_env.md
│       ├── configuration_file.md
│       ├── configuration_flags.md
│       ├── configuration_intro.md
│       ├── event_processors/
│       │   ├── event_add_tag.md
│       │   ├── event_allow.md
│       │   ├── event_combine.md
│       │   ├── event_convert.md
│       │   ├── event_data_convert.md
│       │   ├── event_date_string.md
│       │   ├── event_delete.md
│       │   ├── event_drop.md
│       │   ├── event_duration_convert.md
│       │   ├── event_extract_tags.md
│       │   ├── event_group_by.md
│       │   ├── event_ieeefloat32.md
│       │   ├── event_jq.md
│       │   ├── event_merge.md
│       │   ├── event_override_ts.md
│       │   ├── event_plugin.md
│       │   ├── event_rate_limit.md
│       │   ├── event_starlark.md
│       │   ├── event_strings.md
│       │   ├── event_time_epoch.md
│       │   ├── event_to_tag.md
│       │   ├── event_trigger.md
│       │   ├── event_value_tag.md
│       │   ├── event_write.md
│       │   └── intro.md
│       ├── gnmi_server.md
│       ├── golang_package/
│       │   ├── examples/
│       │   │   ├── capabilities.md
│       │   │   ├── get.md
│       │   │   ├── set.md
│       │   │   └── subscribe.md
│       │   ├── gnmi_options.md
│       │   ├── intro.md
│       │   └── target_options.md
│       ├── inputs/
│       │   ├── input_intro.md
│       │   ├── jetstream_input.md
│       │   ├── kafka_input.md
│       │   ├── nats_input.md
│       │   └── stan_input.md
│       ├── outputs/
│       │   ├── asciigraph_output.md
│       │   ├── file_output.md
│       │   ├── gnmi_output.md
│       │   ├── influxdb_output.md
│       │   ├── jetstream_output.md
│       │   ├── kafka_output.md
│       │   ├── nats_output.md
│       │   ├── otlp_output.md
│       │   ├── output_intro.md
│       │   ├── prometheus_output.md
│       │   ├── prometheus_write_output.md
│       │   ├── snmp_output.md
│       │   ├── stan_output.md
│       │   ├── tcp_output.md
│       │   └── udp_output.md
│       ├── prompt_suggestions.md
│       ├── subscriptions.md
│       ├── targets/
│       │   ├── target_discovery/
│       │   │   ├── consul_discovery.md
│       │   │   ├── discovery_intro.md
│       │   │   ├── docker_discovery.md
│       │   │   ├── file_discovery.md
│       │   │   └── http_discovery.md
│       │   ├── targets.md
│       │   └── targets_session_sec.md
│       └── tunnel_server.md
├── examples/
│   ├── deployments/
│   │   ├── 1.single-instance/
│   │   │   ├── 1.nats-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── nats.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 10.prometheus-with-cache/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       ├── prometheus/
│   │   │   │       │   └── prometheus.yaml
│   │   │   │       └── prometheus.clab.yaml
│   │   │   ├── 11.kafka-kraft-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── kafka.clab.yaml
│   │   │   ├── 2.kafka-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── kafka.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 3.influxdb-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   └── influxdb.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic1.yaml
│   │   │   ├── 4.prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── prometheus/
│   │   │   │   │   │   └── prometheus.yaml
│   │   │   │   │   └── prometheus.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic1.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 5.multiple-outputs/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── multiple-outputs.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic1.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 6.prometheus-write-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       ├── prometheus/
│   │   │   │       │   └── prometheus.yaml
│   │   │   │       └── prometheus.clab.yaml
│   │   │   ├── 7.cortex-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── cortex/
│   │   │   │       │   └── single-process-config-blocks.yaml
│   │   │   │       ├── cortexmetrics.clab.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── grafana/
│   │   │   │           └── datasources/
│   │   │   │               └── datasource.yaml
│   │   │   ├── 8.victoria-metrics-output/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       └── victoriametrics.clab.yaml
│   │   │   └── 9.jetstream-output/
│   │   │       └── containerlab/
│   │   │           ├── gnmic.yaml
│   │   │           └── jetstream.clab.yaml
│   │   ├── 2.clusters/
│   │   │   ├── 1.influxdb-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   └── lab21.clab.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       └── gnmic.yaml
│   │   │   ├── 2.prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── lab22.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   ├── docker-compose/
│   │   │   │   │   ├── docker-compose.yaml
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── kubernetes/
│   │   │   │       ├── consul/
│   │   │   │       │   ├── deployment.yaml
│   │   │   │       │   └── service.yaml
│   │   │   │       ├── gnmic-app/
│   │   │   │       │   ├── configmap.yaml
│   │   │   │       │   ├── secret.yaml
│   │   │   │       │   ├── service.yaml
│   │   │   │       │   └── statefulset.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── servicemonitor.yaml
│   │   │   ├── 3.nats-input-prometheus-output/
│   │   │   │   ├── containerlab/
│   │   │   │   │   ├── gnmic.yaml
│   │   │   │   │   ├── grafana/
│   │   │   │   │   │   └── datasources/
│   │   │   │   │   │       └── datasource.yaml
│   │   │   │   │   ├── lab23.clab.yaml
│   │   │   │   │   └── prometheus/
│   │   │   │   │       └── prometheus.yaml
│   │   │   │   └── docker-compose/
│   │   │   │       ├── docker-compose.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   ├── 4.gnmi-server/
│   │   │   │   └── containerlab/
│   │   │   │       ├── gnmi-server.clab.yaml
│   │   │   │       ├── gnmic-agg.yaml
│   │   │   │       ├── gnmic.yaml
│   │   │   │       ├── grafana/
│   │   │   │       │   ├── dashboards/
│   │   │   │       │   │   └── gNMIc/
│   │   │   │       │   │       ├── gnmic_compute_metrics.json
│   │   │   │       │   │       └── gnmic_grpc_metrics.json
│   │   │   │       │   ├── dashboards.yaml
│   │   │   │       │   └── datasources/
│   │   │   │       │       └── datasource.yaml
│   │   │   │       └── prometheus/
│   │   │   │           └── prometheus.yaml
│   │   │   └── 5.shared-cache/
│   │   │       ├── jetstream/
│   │   │       │   └── containerlab/
│   │   │       │       ├── gnmic.yaml
│   │   │       │       ├── grafana/
│   │   │       │       │   └── datasources/
│   │   │       │       │       └── datasource.yaml
│   │   │       │       ├── lab25-1.clab.yaml
│   │   │       │       └── prometheus/
│   │   │       │           └── prometheus.yaml
│   │   │       ├── nats/
│   │   │       │   └── containerlab/
│   │   │       │       ├── gnmic.yaml
│   │   │       │       ├── grafana/
│   │   │       │       │   └── datasources/
│   │   │       │       │       └── datasource.yaml
│   │   │       │       ├── lab25-2.clab.yaml
│   │   │       │       └── prometheus/
│   │   │       │           └── prometheus.yaml
│   │   │       └── redis/
│   │   │           └── containerlab/
│   │   │               ├── gnmic.yaml
│   │   │               ├── grafana/
│   │   │               │   └── datasources/
│   │   │               │       └── datasource.yaml
│   │   │               ├── lab25-3.clab.yaml
│   │   │               └── prometheus/
│   │   │                   └── prometheus.yaml
│   │   └── 3.pipelines/
│   │       ├── 1.gnmic-nats-gnmic-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-collector.yaml
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab31.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       ├── 2.gnmic-nats-gnmic-influxdb/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-collector.yaml
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   └── lab32.clab.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       └── gnmic-relay.yaml
│   │       ├── 3a.gnmic-cluster-nats-gnmic-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── gnmic.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab33a.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       ├── 3b.gnmic-cluster-nats-gnmic-cluster-prometheus/
│   │       │   ├── containerlab/
│   │       │   │   ├── gnmic-relay.yaml
│   │       │   │   ├── gnmic.yaml
│   │       │   │   ├── grafana/
│   │       │   │   │   └── datasources/
│   │       │   │   │       └── datasource.yaml
│   │       │   │   ├── lab33b.clab.yaml
│   │       │   │   └── prometheus/
│   │       │   │       └── prometheus.yaml
│   │       │   └── docker-compose/
│   │       │       ├── docker-compose.yaml
│   │       │       ├── gnmic-collector.yaml
│   │       │       ├── gnmic-relay.yaml
│   │       │       └── prometheus/
│   │       │           └── prometheus.yaml
│   │       └── 4.gnmic-nats-gnmic-prometheus-gnmic-influxdb/
│   │           └── docker-compose/
│   │               ├── docker-compose.yaml
│   │               ├── gnmic-collector.yaml
│   │               ├── gnmic-relay1.yaml
│   │               ├── gnmic-relay2.yaml
│   │               └── prometheus/
│   │                   └── prometheus.yaml
│   ├── pkg/
│   │   ├── capabilities_rpc/
│   │   │   └── main.go
│   │   ├── get_rpc/
│   │   │   └── main.go
│   │   ├── set_rpc/
│   │   │   └── main.go
│   │   └── subscribe_rpc/
│   │       └── main.go
│   ├── plugins/
│   │   ├── demo/
│   │   │   └── main.go
│   │   ├── event-add-hostname/
│   │   │   ├── README.md
│   │   │   └── event-add-hostname.go
│   │   ├── event-gnmi-get/
│   │   │   ├── README.md
│   │   │   └── event-gnmi-get.go
│   │   ├── go-event-plugin/
│   │   │   └── event-go-plugin.go
│   │   └── minimal/
│   │       └── event-my-processor.go
│   └── set-request-templates/
│       └── Nokia/
│           └── SRL/
│               ├── 1.interfaces/
│               │   ├── interfaces_template.gotmpl
│               │   ├── interfaces_template_vars.yaml
│               │   └── subinterfaces_template.gotmpl
│               ├── 2.network-instance/
│               │   ├── network_instance_bgp_evpn_template.gotmpl
│               │   ├── network_instance_bgp_template.gotmpl
│               │   ├── network_instance_bgp_vpn_template.gotmpl
│               │   ├── network_instance_template.gotmpl
│               │   └── network_instance_template_vars.yaml
│               └── 3.acl/
│                   ├── acl_template.gotmpl
│                   └── acl_template_vars.yaml
├── go.mod
├── go.sum
├── goreleaser-alpine.dockerfile
├── goreleaser-scratch.dockerfile
├── install.sh
├── main.go
├── mkdocs.yml
├── pkg/
│   ├── actions/
│   │   ├── action.go
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── gnmi_action/
│   │   │   ├── gnmi_action.go
│   │   │   ├── gnmi_action_test.go
│   │   │   └── options.go
│   │   ├── http_action/
│   │   │   ├── http_action.go
│   │   │   └── http_action_test.go
│   │   ├── script_action/
│   │   │   ├── options.go
│   │   │   └── script_action.go
│   │   └── template_action/
│   │       ├── options.go
│   │       └── template_action.go
│   ├── api/
│   │   ├── gnmi_msgs.go
│   │   ├── gnmi_msgs_test.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── path/
│   │   │   ├── path.go
│   │   │   └── path_test.go
│   │   ├── server/
│   │   │   ├── options.go
│   │   │   └── server.go
│   │   ├── target/
│   │   │   ├── subscribe.go
│   │   │   └── target.go
│   │   ├── target.go
│   │   ├── target_test.go
│   │   ├── testutils/
│   │   │   └── utils.go
│   │   ├── tunnel.go
│   │   ├── tunnel_test.go
│   │   ├── types/
│   │   │   ├── sasl.go
│   │   │   ├── subscription.go
│   │   │   ├── target.go
│   │   │   └── tls.go
│   │   └── utils/
│   │       ├── tls.go
│   │       ├── utils.go
│   │       └── utils_test.go
│   ├── app/
│   │   ├── api.go
│   │   ├── app.go
│   │   ├── capabilities.go
│   │   ├── clustering.go
│   │   ├── clustering_test.go
│   │   ├── const.go
│   │   ├── diff.go
│   │   ├── generate.go
│   │   ├── generatePath.go
│   │   ├── get.go
│   │   ├── getset.go
│   │   ├── gnmi_client.go
│   │   ├── gnmi_client_subscribe.go
│   │   ├── gnmi_server.go
│   │   ├── inputs.go
│   │   ├── loaders.go
│   │   ├── locker.go
│   │   ├── logging.go
│   │   ├── metrics.go
│   │   ├── outputs.go
│   │   ├── path.go
│   │   ├── path_test.go
│   │   ├── plugins.go
│   │   ├── pprof.go
│   │   ├── processor.go
│   │   ├── prompt.go
│   │   ├── proxy.go
│   │   ├── routes.go
│   │   ├── set-to-notifs.go
│   │   ├── set.go
│   │   ├── setrequest.go
│   │   ├── subscribe.go
│   │   ├── subscribe_once.go
│   │   ├── subscribe_poll.go
│   │   ├── subscribe_prompt.go
│   │   ├── target.go
│   │   ├── tree.go
│   │   ├── tunnel.go
│   │   ├── utils.go
│   │   └── version.go
│   ├── cache/
│   │   ├── cache.go
│   │   ├── go.mod
│   │   ├── go.sum
│   │   ├── jetstream_cache.go
│   │   ├── jetstream_cache_test.go
│   │   ├── nats_cache.go
│   │   ├── oc_cache.go
│   │   ├── oc_cache_test.go
│   │   ├── options.go
│   │   └── redis_cache.go
│   ├── cmd/
│   │   ├── capabilities/
│   │   │   └── capabilities.go
│   │   ├── collector/
│   │   │   ├── collector.go
│   │   │   ├── inputs.go
│   │   │   ├── ouputs.go
│   │   │   ├── processors.go
│   │   │   ├── subscriptions.go
│   │   │   └── targets.go
│   │   ├── completion.go
│   │   ├── diff/
│   │   │   └── diff.go
│   │   ├── generate/
│   │   │   ├── generate.go
│   │   │   ├── generatePath.go
│   │   │   └── generateSetRequest.go
│   │   ├── get/
│   │   │   └── get.go
│   │   ├── getset/
│   │   │   └── getset.go
│   │   ├── listener/
│   │   │   └── listener.go
│   │   ├── path/
│   │   │   └── path.go
│   │   ├── processor/
│   │   │   └── processor.go
│   │   ├── prompt.go
│   │   ├── prompt_test.go
│   │   ├── proxy/
│   │   │   └── proxy.go
│   │   ├── root.go
│   │   ├── set/
│   │   │   └── set.go
│   │   ├── subscribe/
│   │   │   └── subscribe.go
│   │   ├── tree/
│   │   │   └── tree.go
│   │   └── version/
│   │       ├── version.go
│   │       └── versionUpgrade.go
│   ├── collector/
│   │   ├── api/
│   │   │   ├── const/
│   │   │   │   └── const.go
│   │   │   └── server/
│   │   │       ├── apiserver.go
│   │   │       ├── apply.go
│   │   │       ├── assignment.go
│   │   │       ├── cluster.go
│   │   │       ├── inputs.go
│   │   │       ├── metrics.go
│   │   │       ├── outputs.go
│   │   │       ├── processors.go
│   │   │       ├── routes.go
│   │   │       ├── sse.go
│   │   │       ├── subscriptions.go
│   │   │       ├── targets.go
│   │   │       └── tunnel_target_match.go
│   │   ├── collector.go
│   │   ├── env/
│   │   │   ├── env.go
│   │   │   └── env_test.go
│   │   ├── managers/
│   │   │   ├── cluster/
│   │   │   │   ├── assigner.go
│   │   │   │   ├── cluster_manager.go
│   │   │   │   ├── election.go
│   │   │   │   ├── membership.go
│   │   │   │   ├── placement.go
│   │   │   │   ├── rebalance.go
│   │   │   │   └── utils.go
│   │   │   ├── inputs/
│   │   │   │   └── inputs_manager.go
│   │   │   ├── outputs/
│   │   │   │   └── outputs_manager.go
│   │   │   └── targets/
│   │   │       ├── cluster.go
│   │   │       ├── loader.go
│   │   │       ├── metrics.go
│   │   │       ├── targets_manager.go
│   │   │       └── tunnel_server.go
│   │   └── store/
│   │       ├── store.go
│   │       └── types.go
│   ├── config/
│   │   ├── actions.go
│   │   ├── api_server.go
│   │   ├── clustering.go
│   │   ├── config.go
│   │   ├── config_test.go
│   │   ├── diff.go
│   │   ├── environment.go
│   │   ├── gnmi_ext.go
│   │   ├── gnmi_server.go
│   │   ├── inputs.go
│   │   ├── loader.go
│   │   ├── locker.go
│   │   ├── outputs.go
│   │   ├── outputs_test.go
│   │   ├── plugins.go
│   │   ├── processors.go
│   │   ├── processors_test.go
│   │   ├── set.go
│   │   ├── set_test.go
│   │   ├── subscriptions.go
│   │   ├── subscriptions_test.go
│   │   ├── targets.go
│   │   ├── targets_test.go
│   │   └── tunnel_server.go
│   ├── file/
│   │   └── file.go
│   ├── formatters/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── event.go
│   │   ├── event_add_tag/
│   │   │   ├── event_add_tag.go
│   │   │   └── event_add_tag_test.go
│   │   ├── event_allow/
│   │   │   ├── event_allow.go
│   │   │   └── event_allow_test.go
│   │   ├── event_combine/
│   │   │   ├── event_combine.go
│   │   │   └── event_combine_test/
│   │   │       └── event_combine_test.go
│   │   ├── event_convert/
│   │   │   ├── event_convert.go
│   │   │   └── event_convert_test.go
│   │   ├── event_data_convert/
│   │   │   ├── event_data_convert.go
│   │   │   └── event_data_convert_test.go
│   │   ├── event_date_string/
│   │   │   ├── event_date_string.go
│   │   │   └── event_date_string_test.go
│   │   ├── event_delete/
│   │   │   ├── event_delete.go
│   │   │   └── event_delete_test.go
│   │   ├── event_drop/
│   │   │   ├── event_drop.go
│   │   │   └── event_drop_test.go
│   │   ├── event_duration_convert/
│   │   │   ├── event_duration_convert.go
│   │   │   └── event_duration_convert_test.go
│   │   ├── event_extract_tags/
│   │   │   ├── event_extract_tags.go
│   │   │   └── event_extract_tags_test.go
│   │   ├── event_group_by/
│   │   │   ├── event_group_by.go
│   │   │   └── event_group_by_test.go
│   │   ├── event_ieeefloat32/
│   │   │   ├── event_ieeefloat32.go
│   │   │   └── event_ieeefloat32_test.go
│   │   ├── event_jq/
│   │   │   ├── event_jq.go
│   │   │   └── event_jq_test.go
│   │   ├── event_merge/
│   │   │   ├── event_merge.go
│   │   │   └── event_merge_test.go
│   │   ├── event_override_ts/
│   │   │   ├── event_override_ts.go
│   │   │   └── event_override_ts_test.go
│   │   ├── event_plugin/
│   │   │   ├── plugin.go
│   │   │   └── rpc.go
│   │   ├── event_rate_limit/
│   │   │   ├── event_rate_limit.go
│   │   │   └── event_rate_limit_test.go
│   │   ├── event_starlark/
│   │   │   ├── dict.go
│   │   │   ├── event.go
│   │   │   ├── event_starlark.go
│   │   │   └── event_starlark_test.go
│   │   ├── event_strings/
│   │   │   ├── event_strings.go
│   │   │   └── event_strings_test.go
│   │   ├── event_test.go
│   │   ├── event_time_epoch/
│   │   │   ├── event_time_epoch.go
│   │   │   └── event_time_epoch_test.go
│   │   ├── event_to_tag/
│   │   │   ├── event_to_tag.go
│   │   │   └── event_to_tag_test.go
│   │   ├── event_trigger/
│   │   │   ├── event_trigger.go
│   │   │   └── event_trigger_test.go
│   │   ├── event_value_tag/
│   │   │   ├── event_value_tag.go
│   │   │   └── event_value_tag_test.go
│   │   ├── event_value_tag_v2/
│   │   │   ├── event_value_tag_v2.go
│   │   │   └── event_value_tag_v2_test.go
│   │   ├── event_write/
│   │   │   ├── event_write.go
│   │   │   └── event_write_test.go
│   │   ├── flat.go
│   │   ├── formats.go
│   │   ├── json.go
│   │   ├── msg.go
│   │   ├── plugin_manager/
│   │   │   └── manager.go
│   │   ├── processors.go
│   │   └── processors_test.go
│   ├── gtemplate/
│   │   ├── template.go
│   │   └── template_funcs.go
│   ├── inputs/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── input.go
│   │   ├── jetstream_input/
│   │   │   ├── jetstream_input.go
│   │   │   └── jetstream_input_test.go
│   │   ├── kafka_input/
│   │   │   ├── kafka_input.go
│   │   │   └── kafka_scram_client.go
│   │   └── nats_input/
│   │       └── nats_input.go
│   ├── loaders/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── consul_loader/
│   │   │   ├── consul_loader.go
│   │   │   ├── consul_loader_metrics.go
│   │   │   ├── consul_loader_test.go
│   │   │   └── options.go
│   │   ├── docker_loader/
│   │   │   ├── docker_loader.go
│   │   │   ├── docker_loader_metrics.go
│   │   │   └── options.go
│   │   ├── file_loader/
│   │   │   ├── file_loader.go
│   │   │   ├── file_loader_metrics.go
│   │   │   └── options.go
│   │   ├── http_loader/
│   │   │   ├── http_loader.go
│   │   │   ├── http_loader_metrics.go
│   │   │   ├── http_loader_test.go
│   │   │   └── options.go
│   │   ├── loaders.go
│   │   ├── loaders_test.go
│   │   └── option.go
│   ├── lockers/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── consul_locker/
│   │   │   ├── consul_locker.go
│   │   │   └── consul_registration.go
│   │   ├── k8s_locker/
│   │   │   ├── k8s_locker.go
│   │   │   └── k8s_registration.go
│   │   ├── locker.go
│   │   └── redis_locker/
│   │       ├── redis_locker.go
│   │       └── redis_registration.go
│   ├── logging/
│   │   └── logging.go
│   ├── outputs/
│   │   ├── all/
│   │   │   └── all.go
│   │   ├── asciigraph_output/
│   │   │   └── asciigraph.go
│   │   ├── file/
│   │   │   ├── file_metrics.go
│   │   │   ├── file_output.go
│   │   │   └── rotating_file.go
│   │   ├── gnmi_output/
│   │   │   ├── gnmi_output.go
│   │   │   ├── gnmi_server.go
│   │   │   ├── gnmi_server_get.go
│   │   │   ├── gnmi_server_set.go
│   │   │   └── gnmi_server_subscribe.go
│   │   ├── influxdb_output/
│   │   │   ├── influxdb_cache.go
│   │   │   └── influxdb_output.go
│   │   ├── kafka_output/
│   │   │   ├── kafka_metrics.go
│   │   │   ├── kafka_output.go
│   │   │   └── kafka_scram_client.go
│   │   ├── nats_outputs/
│   │   │   ├── jetstream/
│   │   │   │   ├── jetstream_output.go
│   │   │   │   ├── jetstream_output_metrics.go
│   │   │   │   └── jetstream_output_test.go
│   │   │   └── nats/
│   │   │       ├── nats_metrics.go
│   │   │       └── nats_output.go
│   │   ├── options.go
│   │   ├── otlp_output/
│   │   │   ├── otlp_converter.go
│   │   │   ├── otlp_metrics.go
│   │   │   ├── otlp_output.go
│   │   │   └── otlp_output_test.go
│   │   ├── output.go
│   │   ├── prometheus_output/
│   │   │   ├── prometheus_common.go
│   │   │   ├── prometheus_common_test.go
│   │   │   ├── prometheus_output/
│   │   │   │   ├── prometheus_cache.go
│   │   │   │   ├── prometheus_metrics.go
│   │   │   │   ├── prometheus_output.go
│   │   │   │   └── prometheus_service_registration.go
│   │   │   └── prometheus_write_output/
│   │   │       ├── prometheus_write_client.go
│   │   │       ├── prometheus_write_metrics.go
│   │   │       └── prometheus_write_output.go
│   │   ├── protometa.go
│   │   ├── snmp_output/
│   │   │   ├── snmp_metrics.go
│   │   │   └── snmp_output.go
│   │   ├── tcp_output/
│   │   │   └── tcp_output.go
│   │   └── udp_output/
│   │       └── udp_output.go
│   ├── pipeline/
│   │   └── pipeline.go
│   ├── utils/
│   │   ├── authbrearer.go
│   │   ├── gnmi.go
│   │   ├── gnmiext.go
│   │   └── store.go
│   └── version/
│       └── version.go
└── tests/
    ├── api.sh
    ├── capabilities_cmd.sh
    ├── clab/
    │   ├── labN.clab.yaml
    │   ├── loaders/
    │   │   ├── gnmic-agg.yaml
    │   │   ├── gnmic-docker-loader.yaml
    │   │   ├── gnmic-file-loader.yaml
    │   │   ├── loaders.clab.yaml
    │   │   ├── loaders.clab_vars.yaml
    │   │   └── targets/
    │   │       └── targets.yaml
    │   ├── telemetry/
    │   │   ├── gnmic-agg.yaml
    │   │   ├── gnmic.yaml
    │   │   ├── grafana/
    │   │   │   ├── dashboards.yaml
    │   │   │   └── datasources/
    │   │   │       └── datasource.yaml
    │   │   ├── prometheus/
    │   │   │   └── prometheus.yaml
    │   │   └── telemetry.clab.yaml
    │   └── test_lab1.clab.yaml
    ├── cleanup.sh
    ├── cluster_checks.sh
    ├── cluster_funcs.sh
    ├── configs/
    │   ├── gnmic1.yaml
    │   ├── gnmic2.yaml
    │   ├── gnmic3.yaml
    │   ├── gnmic4.yaml
    │   ├── gnmic_env.yaml
    │   └── node/
    │       ├── interface.json
    │       ├── interface.yaml
    │       ├── replace_request_file.yaml
    │       └── update_request_file.yaml
    ├── consul_templates/
    │   └── all_services.tpl
    ├── dashboards/
    │   └── gNMIc/
    │       ├── gnmic_compute_metrics.json
    │       └── gnmic_grpc_metrics.json
    ├── deploy.sh
    ├── env_vars.sh
    ├── generate_cmd.sh
    ├── generate_path_cmd.sh
    ├── get_cmd.sh
    ├── loaders.sh
    ├── metrics/
    │   ├── gnmic.yaml
    │   ├── grafana/
    │   │   ├── dashboards.yaml
    │   │   └── datasources/
    │   │       └── datasource.yaml
    │   ├── metrics.clab.yaml
    │   ├── prometheus/
    │   │   └── prometheus.yaml
    │   └── run.sh
    ├── run.sh
    ├── run_tests.sh
    ├── set_cmd.sh
    ├── subscribe_once_cmd.sh
    ├── telemetry_labs.sh
    └── version_cmd.sh
Download .txt
Showing preview only (264K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2842 symbols across 309 files)

FILE: examples/pkg/capabilities_rpc/main.go
  function main (line 21) | func main() {

FILE: examples/pkg/get_rpc/main.go
  function main (line 21) | func main() {

FILE: examples/pkg/set_rpc/main.go
  function main (line 21) | func main() {

FILE: examples/pkg/subscribe_rpc/main.go
  function main (line 22) | func main() {

FILE: examples/plugins/demo/main.go
  constant processorType (line 16) | processorType = "event-add-device_function"
  constant loggingPrefix (line 17) | loggingPrefix = "[" + processorType + "] "
  type MyEventProcessor (line 20) | type MyEventProcessor struct
    method Init (line 30) | func (p *MyEventProcessor) Init(cfg interface{}, opts ...formatters.Op...
    method Apply (line 41) | func (p *MyEventProcessor) Apply(event ...*formatters.EventMsg) []*for...
    method Close (line 52) | func (p *MyEventProcessor) Close() error {
    method WithActions (line 56) | func (p *MyEventProcessor) WithActions(act map[string]map[string]inter...
    method WithTargets (line 60) | func (p *MyEventProcessor) WithTargets(tcs map[string]*types.TargetCon...
    method WithProcessors (line 64) | func (p *MyEventProcessor) WithProcessors(procs map[string]map[string]...
    method WithLogger (line 68) | func (p *MyEventProcessor) WithLogger(l *log.Logger) {
    method setupLogger (line 71) | func (p *MyEventProcessor) setupLogger() {
  function main (line 77) | func main() {

FILE: examples/plugins/event-add-hostname/event-add-hostname.go
  constant processorType (line 20) | processorType = "event-add-hostname"
  constant loggingPrefix (line 21) | loggingPrefix = "[" + processorType + "] "
  constant hostnameCmd (line 22) | hostnameCmd   = "hostname"
  type addHostnameProcessor (line 25) | type addHostnameProcessor struct
    method Init (line 41) | func (p *addHostnameProcessor) Init(cfg interface{}, opts ...formatter...
    method Apply (line 57) | func (p *addHostnameProcessor) Apply(event ...*formatters.EventMsg) []...
    method Close (line 74) | func (p *addHostnameProcessor) Close() error {
    method WithActions (line 78) | func (p *addHostnameProcessor) WithActions(act map[string]map[string]i...
    method WithTargets (line 82) | func (p *addHostnameProcessor) WithTargets(tcs map[string]*types.Targe...
    method WithProcessors (line 86) | func (p *addHostnameProcessor) WithProcessors(procs map[string]map[str...
    method WithLogger (line 90) | func (p *addHostnameProcessor) WithLogger(l *log.Logger) {
    method setupLogger (line 93) | func (p *addHostnameProcessor) setupLogger() {
    method readHostname (line 103) | func (p *addHostnameProcessor) readHostname() error {
  function main (line 119) | func main() {

FILE: examples/plugins/event-gnmi-get/event-gnmi-get.go
  constant processorType (line 30) | processorType = "event-gnmi-get"
  constant loggingPrefix (line 31) | loggingPrefix = "[" + processorType + "] "
  constant defaultTarget (line 32) | defaultTarget = `{{ index .Tags "source" }}`
  type gNMIGetProcessor (line 35) | type gNMIGetProcessor struct
    method Init (line 70) | func (p *gNMIGetProcessor) Init(cfg interface{}, opts ...formatters.Op...
    method Apply (line 112) | func (p *gNMIGetProcessor) Apply(event ...*formatters.EventMsg) []*for...
    method Close (line 135) | func (p *gNMIGetProcessor) Close() error {
    method WithActions (line 139) | func (p *gNMIGetProcessor) WithActions(act map[string]map[string]inter...
    method WithTargets (line 143) | func (p *gNMIGetProcessor) WithTargets(tcs map[string]*types.TargetCon...
    method WithProcessors (line 147) | func (p *gNMIGetProcessor) WithProcessors(procs map[string]map[string]...
    method WithLogger (line 151) | func (p *gNMIGetProcessor) WithLogger(l *log.Logger) {
    method setupLogger (line 154) | func (p *gNMIGetProcessor) setupLogger() {
    method readPaths (line 165) | func (p *gNMIGetProcessor) readPaths(e *formatters.EventMsg) (string, ...
    method gnmiGet (line 200) | func (p *gNMIGetProcessor) gnmiGet(targetName string, e *formatters.Ev...
    method selectTarget (line 230) | func (p *gNMIGetProcessor) selectTarget(tName string) (*types.TargetCo...
    method createGetRequest (line 252) | func (p *gNMIGetProcessor) createGetRequest(e *formatters.EventMsg) (*...
    method extractTags (line 286) | func (p *gNMIGetProcessor) extractTags(rsp *gnmi.GetResponse, mapping ...
  type pathToTag (line 58) | type pathToTag struct
  type readValues (line 65) | type readValues struct
  function extractValue (line 301) | func extractValue(tv *gnmi.TypedValue) string {
  function main (line 341) | func main() {

FILE: examples/plugins/go-event-plugin/event-go-plugin.go
  constant processorType (line 16) | processorType = "event-go-plugin"
  constant loggingPrefix (line 17) | loggingPrefix = "[" + processorType + "] "
  type goSampleProcessorPlugin (line 20) | type goSampleProcessorPlugin struct
    method Init (line 30) | func (p *goSampleProcessorPlugin) Init(cfg interface{}, opts ...format...
    method Apply (line 47) | func (p *goSampleProcessorPlugin) Apply(event ...*formatters.EventMsg)...
    method Close (line 53) | func (p *goSampleProcessorPlugin) Close() error {
    method WithActions (line 57) | func (p *goSampleProcessorPlugin) WithActions(act map[string]map[strin...
    method WithTargets (line 61) | func (p *goSampleProcessorPlugin) WithTargets(tcs map[string]*types.Ta...
    method WithProcessors (line 65) | func (p *goSampleProcessorPlugin) WithProcessors(procs map[string]map[...
    method WithLogger (line 69) | func (p *goSampleProcessorPlugin) WithLogger(l *log.Logger) {
  function main (line 72) | func main() {

FILE: examples/plugins/minimal/event-my-processor.go
  constant processorType (line 17) | processorType = "event-my-processor"
  type myProcessor (line 20) | type myProcessor struct
    method Init (line 25) | func (p *myProcessor) Init(cfg interface{}, opts ...formatters.Option)...
    method Apply (line 39) | func (p *myProcessor) Apply(event ...*formatters.EventMsg) []*formatte...
    method Close (line 44) | func (p *myProcessor) Close() error {
    method WithActions (line 48) | func (p *myProcessor) WithActions(act map[string]map[string]interface{...
    method WithTargets (line 51) | func (p *myProcessor) WithTargets(tcs map[string]*types.TargetConfig) {
    method WithProcessors (line 54) | func (p *myProcessor) WithProcessors(procs map[string]map[string]any) {
    method WithLogger (line 57) | func (p *myProcessor) WithLogger(l *log.Logger) {
  function main (line 60) | func main() {

FILE: main.go
  function main (line 15) | func main() {

FILE: pkg/actions/action.go
  type Action (line 19) | type Action interface
  type Context (line 39) | type Context struct
  type Option (line 57) | type Option
  type Initializer (line 61) | type Initializer
  function Register (line 63) | func Register(name string, initFn Initializer) {
  function DecodeConfig (line 67) | func DecodeConfig(src, dst interface{}) error {
  function WithTargets (line 80) | func WithTargets(tcs map[string]*types.TargetConfig) Option {
  function WithLogger (line 86) | func WithLogger(l *log.Logger) Option {

FILE: pkg/actions/gnmi_action/gnmi_action.go
  constant defaultRPC (line 37) | defaultRPC      = "get"
  constant loggingPrefix (line 38) | loggingPrefix   = "[gnmi_action] "
  constant actionType (line 39) | actionType      = "gnmi"
  constant defaultDataType (line 40) | defaultDataType = "ALL"
  constant defaultTarget (line 41) | defaultTarget   = `{{ index .Input.Tags "source" }}`
  constant defaultEncoding (line 42) | defaultEncoding = "JSON"
  constant defaultFormat (line 43) | defaultFormat   = "json"
  constant rpcGet (line 47) | rpcGet        = "get"
  constant rpcSet (line 48) | rpcSet        = "set"
  constant rpcSetUpdate (line 49) | rpcSetUpdate  = "set-update"
  constant rpcSetReplace (line 50) | rpcSetReplace = "set-replace"
  constant rpcSetDelete (line 51) | rpcSetDelete  = "set-delete"
  constant rpcDelete (line 52) | rpcDelete     = "delete"
  constant rpcSub (line 53) | rpcSub        = "sub"
  constant rpcSubscribe (line 54) | rpcSubscribe  = "subscribe"
  function init (line 57) | func init() {
  type gnmiAction (line 67) | type gnmiAction struct
    method Init (line 105) | func (g *gnmiAction) Init(cfg map[string]interface{}, opts ...actions....
    method Run (line 129) | func (g *gnmiAction) Run(ctx context.Context, aCtx *actions.Context) (...
    method NName (line 212) | func (g *gnmiAction) NName() string { return g.Name }
    method setDefaults (line 214) | func (g *gnmiAction) setDefaults() {
    method validate (line 239) | func (g *gnmiAction) validate() error {
    method parseTemplates (line 266) | func (g *gnmiAction) parseTemplates() error {
    method createTemplates (line 284) | func (g *gnmiAction) createTemplates(n string, s []string) ([]*templat...
    method createGetRequest (line 296) | func (g *gnmiAction) createGetRequest(in *actions.Context) (*gnmi.GetR...
    method createSetRequest (line 323) | func (g *gnmiAction) createSetRequest(in *actions.Context) (*gnmi.SetR...
    method createSubscribeRequest (line 370) | func (g *gnmiAction) createSubscribeRequest(in *actions.Context) (*gnm...
    method selectTargets (line 398) | func (g *gnmiAction) selectTargets(tName string) ([]*types.TargetConfi...
    method runRPC (line 423) | func (g *gnmiAction) runRPC(ctx context.Context, tc *types.TargetConfi...
    method runGet (line 436) | func (g *gnmiAction) runGet(ctx context.Context, tc *types.TargetConfi...
    method runSet (line 455) | func (g *gnmiAction) runSet(ctx context.Context, tc *types.TargetConfi...
    method runSubscribe (line 474) | func (g *gnmiAction) runSubscribe(ctx context.Context, tc *types.Targe...
  type gnmiResponse (line 509) | type gnmiResponse struct

FILE: pkg/actions/gnmi_action/gnmi_action_test.go
  type getRequestTestItem (line 21) | type getRequestTestItem struct
  type setRequestTestItem (line 26) | type setRequestTestItem struct
  function TestGnmiGetRequest (line 408) | func TestGnmiGetRequest(t *testing.T) {
  function TestGnmiSetRequest (line 439) | func TestGnmiSetRequest(t *testing.T) {

FILE: pkg/actions/gnmi_action/options.go
  method WithTargets (line 19) | func (g *gnmiAction) WithTargets(tcs map[string]*types.TargetConfig) {
  method WithLogger (line 26) | func (g *gnmiAction) WithLogger(logger *log.Logger) {

FILE: pkg/actions/http_action/http_action.go
  constant defaultMethod (line 32) | defaultMethod       = "GET"
  constant defaultTimeout (line 33) | defaultTimeout      = 5 * time.Second
  constant loggingPrefix (line 34) | loggingPrefix       = "[http_action] "
  constant actionType (line 35) | actionType          = "http"
  constant defaultBodyTemplate (line 36) | defaultBodyTemplate = "{{ json . }}"
  function init (line 39) | func init() {
  type httpAction (line 47) | type httpAction struct
    method Init (line 61) | func (h *httpAction) Init(cfg map[string]interface{}, opts ...actions....
    method Run (line 86) | func (h *httpAction) Run(ctx context.Context, aCtx *actions.Context) (...
    method NName (line 145) | func (h *httpAction) NName() string { return h.Name }
    method setDefaults (line 147) | func (h *httpAction) setDefaults() error {
    method WithTargets (line 187) | func (h *httpAction) WithTargets(map[string]*types.TargetConfig) {}
    method WithLogger (line 189) | func (h *httpAction) WithLogger(logger *log.Logger) {

FILE: pkg/actions/http_action/http_action_test.go
  type item (line 30) | type item struct
  function TestHTTPAction (line 454) | func TestHTTPAction(t *testing.T) {
  function echo (line 525) | func echo() http.Handler {

FILE: pkg/actions/script_action/options.go
  method WithTargets (line 19) | func (s *scriptAction) WithTargets(map[string]*types.TargetConfig) {}
  method WithLogger (line 21) | func (s *scriptAction) WithLogger(logger *log.Logger) {

FILE: pkg/actions/script_action/script_action.go
  constant loggingPrefix (line 25) | loggingPrefix = "[script_action] "
  constant actionType (line 26) | actionType    = "script"
  constant defaultShell (line 27) | defaultShell  = "/bin/bash"
  function init (line 30) | func init() {
  type scriptAction (line 38) | type scriptAction struct
    method Init (line 48) | func (s *scriptAction) Init(cfg map[string]interface{}, opts ...action...
    method Run (line 68) | func (s *scriptAction) Run(_ context.Context, aCtx *actions.Context) (...
    method NName (line 104) | func (s *scriptAction) NName() string { return s.Name }
    method setDefaults (line 106) | func (s *scriptAction) setDefaults() error {

FILE: pkg/actions/template_action/options.go
  method WithTargets (line 19) | func (t *templateAction) WithTargets(map[string]*types.TargetConfig) {}
  method WithLogger (line 21) | func (t *templateAction) WithLogger(logger *log.Logger) {

FILE: pkg/actions/template_action/template_action.go
  constant loggingPrefix (line 25) | loggingPrefix   = "[template_action] "
  constant actionType (line 26) | actionType      = "template"
  constant defaultTemplate (line 27) | defaultTemplate = "{{ . }}"
  function init (line 30) | func init() {
  type templateAction (line 38) | type templateAction struct
    method Init (line 49) | func (t *templateAction) Init(cfg map[string]interface{}, opts ...acti...
    method Run (line 82) | func (t *templateAction) Run(_ context.Context, aCtx *actions.Context)...
    method NName (line 114) | func (t *templateAction) NName() string { return t.Name }
    method setDefaults (line 116) | func (t *templateAction) setDefaults() error {

FILE: pkg/api/gnmi_msgs.go
  constant DefaultGNMIVersion (line 29) | DefaultGNMIVersion = "0.7.0"
  constant encodingJSON (line 30) | encodingJSON       = "json"
  constant encodingJSON_IETF (line 31) | encodingJSON_IETF  = "json_ietf"
  type GNMIOption (line 37) | type GNMIOption
  function apply (line 49) | func apply(m proto.Message, opts ...GNMIOption) error {
  function NewCapabilitiesRequest (line 60) | func NewCapabilitiesRequest(opts ...GNMIOption) (*gnmi.CapabilityRequest...
  function NewCapabilitiesResponse (line 71) | func NewCapabilitiesResponse(opts ...GNMIOption) (*gnmi.CapabilityRespon...
  function NewGetRequest (line 85) | func NewGetRequest(opts ...GNMIOption) (*gnmi.GetRequest, error) {
  function NewGetResponse (line 96) | func NewGetResponse(opts ...GNMIOption) (*gnmi.GetResponse, error) {
  function NewSetRequest (line 107) | func NewSetRequest(opts ...GNMIOption) (*gnmi.SetRequest, error) {
  function NewSetResponse (line 115) | func NewSetResponse(opts ...GNMIOption) (*gnmi.SetResponse, error) {
  function NewSubscribeRequest (line 126) | func NewSubscribeRequest(opts ...GNMIOption) (*gnmi.SubscribeRequest, er...
  function NewSubscribePollRequest (line 139) | func NewSubscribePollRequest(opts ...GNMIOption) (*gnmi.SubscribeRequest...
  function NewSubscribeResponse (line 151) | func NewSubscribeResponse(opts ...GNMIOption) (*gnmi.SubscribeResponse, ...
  function NewSubscribeSyncResponse (line 166) | func NewSubscribeSyncResponse(opts ...GNMIOption) (*gnmi.SubscribeRespon...
  function Version (line 182) | func Version(v string) func(msg proto.Message) error {
  function SupportedEncoding (line 198) | func SupportedEncoding(encodings ...string) func(msg proto.Message) error {
  function SupportedModel (line 223) | func SupportedModel(name, org, version string) func(msg proto.Message) e...
  function Extension (line 248) | func Extension(ext *gnmi_ext.Extension) func(msg proto.Message) error {
  function Extension_CommitRequest (line 294) | func Extension_CommitRequest(id string, dur time.Duration) func(msg prot...
  function Extension_CommitConfirm (line 322) | func Extension_CommitConfirm(id string) func(msg proto.Message) error {
  function Extension_CommitCancel (line 348) | func Extension_CommitCancel(id string) func(msg proto.Message) error {
  function Extension_CommitSetRollbackDuration (line 374) | func Extension_CommitSetRollbackDuration(id string, dur time.Duration) f...
  function Extension_Depth (line 403) | func Extension_Depth(lvl uint32) func(msg proto.Message) error {
  function Extension_HistorySnapshotTime (line 430) | func Extension_HistorySnapshotTime(tm time.Time) func(msg proto.Message)...
  function Extension_HistoryRange (line 458) | func Extension_HistoryRange(start, end time.Time) func(msg proto.Message...
  function Prefix (line 489) | func Prefix(prefix string) func(msg proto.Message) error {
  function Target (line 526) | func Target(target string) func(msg proto.Message) error {
  function Path (line 568) | func Path(p string) func(msg proto.Message) error {
  function Encoding (line 608) | func Encoding(encoding string) func(msg proto.Message) error {
  function EncodingJSON (line 637) | func EncodingJSON() func(msg proto.Message) error {
  function EncodingBYTES (line 643) | func EncodingBYTES() func(msg proto.Message) error {
  function EncodingPROTO (line 649) | func EncodingPROTO() func(msg proto.Message) error {
  function EncodingASCII (line 655) | func EncodingASCII() func(msg proto.Message) error {
  function EncodingJSON_IETF (line 661) | func EncodingJSON_IETF() func(msg proto.Message) error {
  function EncodingCustom (line 668) | func EncodingCustom(enc int) func(msg proto.Message) error {
  function DataType (line 693) | func DataType(datat string) func(msg proto.Message) error {
  function DataTypeALL (line 716) | func DataTypeALL() func(msg proto.Message) error {
  function DataTypeCONFIG (line 721) | func DataTypeCONFIG() func(msg proto.Message) error {
  function DataTypeSTATE (line 726) | func DataTypeSTATE() func(msg proto.Message) error {
  function DataTypeOPERATIONAL (line 731) | func DataTypeOPERATIONAL() func(msg proto.Message) error {
  function UseModel (line 737) | func UseModel(name, org, version string) func(msg proto.Message) error {
  function Update (line 779) | func Update(opts ...GNMIOption) func(msg proto.Message) error {
  function Replace (line 814) | func Replace(opts ...GNMIOption) func(msg proto.Message) error {
  function Value (line 840) | func Value(data interface{}, encoding string) func(msg proto.Message) er...
  function value (line 859) | func value(data interface{}, encoding string) (*gnmi.TypedValue, error) {
  function Delete (line 1051) | func Delete(p string) func(msg proto.Message) error {
  function SubscriptionListMode (line 1085) | func SubscriptionListMode(mode string) func(msg proto.Message) error {
  function SubscriptionListModeSTREAM (line 1113) | func SubscriptionListModeSTREAM() func(msg proto.Message) error {
  function SubscriptionListModeONCE (line 1118) | func SubscriptionListModeONCE() func(msg proto.Message) error {
  function SubscriptionListModePOLL (line 1123) | func SubscriptionListModePOLL() func(msg proto.Message) error {
  function Qos (line 1128) | func Qos(qos uint32) func(msg proto.Message) error {
  function AllowAggregation (line 1149) | func AllowAggregation(b bool) func(msg proto.Message) error {
  function UpdatesOnly (line 1170) | func UpdatesOnly(b bool) func(msg proto.Message) error {
  function Subscription (line 1192) | func Subscription(opts ...GNMIOption) func(msg proto.Message) error {
  function SubscriptionMode (line 1221) | func SubscriptionMode(mode string) func(msg proto.Message) error {
  function SubscriptionModeTARGET_DEFINED (line 1241) | func SubscriptionModeTARGET_DEFINED() func(msg proto.Message) error {
  function SubscriptionModeON_CHANGE (line 1246) | func SubscriptionModeON_CHANGE() func(msg proto.Message) error {
  function SubscriptionModeSAMPLE (line 1251) | func SubscriptionModeSAMPLE() func(msg proto.Message) error {
  function SampleInterval (line 1256) | func SampleInterval(d time.Duration) func(msg proto.Message) error {
  function HeartbeatInterval (line 1272) | func HeartbeatInterval(d time.Duration) func(msg proto.Message) error {
  function SuppressRedundant (line 1288) | func SuppressRedundant(s bool) func(msg proto.Message) error {
  function Notification (line 1305) | func Notification(opts ...GNMIOption) func(msg proto.Message) error {
  function Timestamp (line 1339) | func Timestamp(t int64) func(msg proto.Message) error {
  function TimestampNow (line 1357) | func TimestampNow() func(msg proto.Message) error {
  function Atomic (line 1362) | func Atomic(b bool) func(msg proto.Message) error {
  function UpdateResult (line 1376) | func UpdateResult(opts ...GNMIOption) func(msg proto.Message) error {
  function Operation (line 1398) | func Operation(oper string) func(msg proto.Message) error {
  function OperationINVALID (line 1418) | func OperationINVALID() func(msg proto.Message) error {
  function OperationDELETE (line 1423) | func OperationDELETE() func(msg proto.Message) error {
  function OperationREPLACE (line 1428) | func OperationREPLACE() func(msg proto.Message) error {
  function OperationUPDATE (line 1433) | func OperationUPDATE() func(msg proto.Message) error {
  function UnionReplace (line 1439) | func UnionReplace(opts ...GNMIOption) func(msg proto.Message) error {

FILE: pkg/api/gnmi_msgs_test.go
  function TestNewCapabilitiesRequest (line 25) | func TestNewCapabilitiesRequest(t *testing.T) {
  type capResponseInput (line 42) | type capResponseInput struct
  function TestNewCapabilitiesResponse (line 92) | func TestNewCapabilitiesResponse(t *testing.T) {
  type getRequestInput (line 117) | type getRequestInput struct
  function TestNewGetRequest (line 380) | func TestNewGetRequest(t *testing.T) {
  type getResponseInput (line 398) | type getResponseInput struct
  function TestNewGetResponse (line 491) | func TestNewGetResponse(t *testing.T) {
  type setRequestInput (line 510) | type setRequestInput struct
  function TestNewSetRequest (line 777) | func TestNewSetRequest(t *testing.T) {
  type setResponseInput (line 795) | type setResponseInput struct
  function TestNewSetResponse (line 859) | func TestNewSetResponse(t *testing.T) {
  type subscribeRequestInput (line 878) | type subscribeRequestInput struct
  function TestNewSubscribeRequest (line 1229) | func TestNewSubscribeRequest(t *testing.T) {
  type subscribeResponseInput (line 1247) | type subscribeResponseInput struct
  function TestNewSubscribeResponse (line 1304) | func TestNewSubscribeResponse(t *testing.T) {
  function TestNewSubscribeRequestPoll (line 1322) | func TestNewSubscribeRequestPoll(t *testing.T) {
  function TestNewSubscribeResponseSync (line 1342) | func TestNewSubscribeResponseSync(t *testing.T) {
  type valueInput (line 1364) | type valueInput struct
  function TestValue (line 1637) | func TestValue(t *testing.T) {
  function TestVersion (line 1664) | func TestVersion(t *testing.T) {
  function TestSupportedEncoding (line 1687) | func TestSupportedEncoding(t *testing.T) {
  function TestSupportedModel (line 1720) | func TestSupportedModel(t *testing.T) {

FILE: pkg/api/path/path.go
  function CreatePrefix (line 33) | func CreatePrefix(prefix, target string) (*gnmi.Path, error) {
  function ParsePath (line 49) | func ParsePath(p string) (*gnmi.Path, error) {
  function toPathElems (line 75) | func toPathElems(p string) ([]*gnmi.PathElem, error) {
  function toPathElem (line 129) | func toPathElem(s string) (*gnmi.PathElem, error) {
  function parseXPathKeys (line 157) | func parseXPathKeys(s string) (map[string]string, error) {
  function PathElems (line 209) | func PathElems(pf, p *gnmi.Path) []*gnmi.PathElem {
  function GnmiPathToXPath (line 215) | func GnmiPathToXPath(p *gnmi.Path, noKeys bool) string {
  function writeKey (line 259) | func writeKey(sb *strings.Builder, k, v string) {

FILE: pkg/api/path/path_test.go
  type outKeysSet (line 368) | type outKeysSet struct
  type outPathElemSet (line 372) | type outPathElemSet struct
  function TestCreatePrefix (line 486) | func TestCreatePrefix(t *testing.T) {
  function TestParsePath (line 508) | func TestParsePath(t *testing.T) {
  function TestParseXPathKeys (line 528) | func TestParseXPathKeys(t *testing.T) {
  function TestStringToPathElem (line 542) | func TestStringToPathElem(t *testing.T) {
  function BenchmarkParsePath (line 560) | func BenchmarkParsePath(b *testing.B) {
  function TestGnmiPathToXPath (line 571) | func TestGnmiPathToXPath(t *testing.T) {

FILE: pkg/api/server/options.go
  method serverOpts (line 26) | func (s *gNMIServer) serverOpts() ([]grpc.ServerOption, error) {
  method interceptorsOpts (line 50) | func (s *gNMIServer) interceptorsOpts() []grpc.ServerOption {
  type rateLimiterInterceptor (line 72) | type rateLimiterInterceptor struct
    method Limit (line 76) | func (r *rateLimiterInterceptor) Limit() bool {
  method tlsServerOpts (line 80) | func (s *gNMIServer) tlsServerOpts() (grpc.ServerOption, error) {
  method createTLSConfig (line 95) | func (s *gNMIServer) createTLSConfig() (*tls.Config, error) {
  method readCerts (line 128) | func (s *gNMIServer) readCerts(chi *tls.ClientHelloInfo) (*tls.Certifica...

FILE: pkg/api/server/server.go
  type Config (line 37) | type Config struct
    method setDefaults (line 114) | func (c *Config) setDefaults() error {
  type gNMIServer (line 76) | type gNMIServer struct
    method Start (line 148) | func (s *gNMIServer) Start(ctx context.Context) error {
    method Capabilities (line 196) | func (s *gNMIServer) Capabilities(ctx context.Context, req *gnmi.Capab...
    method Get (line 210) | func (s *gNMIServer) Get(ctx context.Context, req *gnmi.GetRequest) (*...
    method Set (line 224) | func (s *gNMIServer) Set(ctx context.Context, req *gnmi.SetRequest) (*...
    method Subscribe (line 238) | func (s *gNMIServer) Subscribe(stream gnmi.GNMI_SubscribeServer) error {
    method acquireUnarySem (line 264) | func (s *gNMIServer) acquireUnarySem(ctx context.Context) error {
    method releaseUnarySem (line 276) | func (s *gNMIServer) releaseUnarySem() {
    method acquireStreamSem (line 283) | func (s *gNMIServer) acquireStreamSem(ctx context.Context) error {
    method releaseStreamSem (line 295) | func (s *gNMIServer) releaseStreamSem() {
  type CapabilitiesHandler (line 98) | type CapabilitiesHandler
  type GetHandler (line 100) | type GetHandler
  type SetHandler (line 102) | type SetHandler
  type SubscribeHandler (line 104) | type SubscribeHandler
  type Option (line 106) | type Option
  function defaultCapabilitiesHandlerFunc (line 108) | func defaultCapabilitiesHandlerFunc(ctx context.Context, req *gnmi.Capab...
  function New (line 124) | func New(c Config, opts ...Option) (*gNMIServer, error) {
  function WithLogger (line 303) | func WithLogger(l *log.Logger) func(*gNMIServer) {
  function WithRegistry (line 309) | func WithRegistry(reg *prometheus.Registry) func(*gNMIServer) {
  function WithCapabilitiesHandler (line 315) | func WithCapabilitiesHandler(h CapabilitiesHandler) func(*gNMIServer) {
  function WithGetHandler (line 321) | func WithGetHandler(h GetHandler) func(*gNMIServer) {
  function WithSetHandler (line 327) | func WithSetHandler(h SetHandler) func(*gNMIServer) {
  function WithSubscribeHandler (line 333) | func WithSubscribeHandler(h SubscribeHandler) func(*gNMIServer) {

FILE: pkg/api/target.go
  type TargetOption (line 25) | type TargetOption
  function NewTarget (line 27) | func NewTarget(opts ...TargetOption) (*target.Target, error) {
  function Name (line 59) | func Name(name string) TargetOption {
  function Address (line 68) | func Address(addr string) TargetOption {
  function Username (line 80) | func Username(username string) TargetOption {
  function Password (line 88) | func Password(password string) TargetOption {
  function Timeout (line 96) | func Timeout(timeout time.Duration) TargetOption {
  function Insecure (line 105) | func Insecure(i bool) TargetOption {
  function SkipVerify (line 114) | func SkipVerify(i bool) TargetOption {
  function TLSCA (line 122) | func TLSCA(tlsca string) TargetOption {
  function TLSCert (line 130) | func TLSCert(cert string) TargetOption {
  function TLSKey (line 138) | func TLSKey(key string) TargetOption {
  function TLSMinVersion (line 146) | func TLSMinVersion(v string) TargetOption {
  function TLSMaxVersion (line 154) | func TLSMaxVersion(v string) TargetOption {
  function TLSVersion (line 162) | func TLSVersion(v string) TargetOption {
  function TLSConfig (line 170) | func TLSConfig(tlsconfig *tls.Config) TargetOption {
  function LogTLSSecret (line 179) | func LogTLSSecret(b bool) TargetOption {
  function Gzip (line 188) | func Gzip(b bool) TargetOption {
  function Token (line 196) | func Token(token string) TargetOption {

FILE: pkg/api/target/subscribe.go
  method Subscribe (line 27) | func (t *Target) Subscribe(ctx context.Context, req *gnmi.SubscribeReque...
  method SubscribeChan (line 159) | func (t *Target) SubscribeChan(ctx context.Context, req *gnmi.SubscribeR...
  method attemptSubscription (line 198) | func (t *Target) attemptSubscription(ctx context.Context, req *gnmi.Subs...
  method handleSTREAMMode (line 254) | func (t *Target) handleSTREAMMode(nctx, ctx context.Context, client gnmi...
  method handleONCEMode (line 270) | func (t *Target) handleONCEMode(nctx, ctx context.Context, client gnmi.G...
  method handlePOLLMode (line 292) | func (t *Target) handlePOLLMode(nctx, ctx context.Context, client gnmi.G...
  function isCancellationError (line 320) | func isCancellationError(err error) bool {
  function sendError (line 329) | func sendError(errCh chan *TargetError, ctx context.Context, subscriptio...
  method SubscribeStreamChan (line 341) | func (t *Target) SubscribeStreamChan(ctx context.Context, req *gnmi.Subs...
  method SubscribeOnceChan (line 415) | func (t *Target) SubscribeOnceChan(ctx context.Context, req *gnmi.Subscr...
  method SubscribeOnce (line 446) | func (t *Target) SubscribeOnce(ctx context.Context, req *gnmi.SubscribeR...
  method SubscribePoll (line 469) | func (t *Target) SubscribePoll(ctx context.Context, subName string) error {
  method ReadSubscriptions (line 483) | func (t *Target) ReadSubscriptions() (chan *SubscribeResponse, chan *Tar...
  method NumberOfOnceSubscriptions (line 487) | func (t *Target) NumberOfOnceSubscriptions() int {
  method DecodeProtoBytes (line 499) | func (t *Target) DecodeProtoBytes(resp *gnmi.SubscribeResponse) error {
  method DeleteSubscription (line 524) | func (t *Target) DeleteSubscription(name string) {
  method StopSubscription (line 535) | func (t *Target) StopSubscription(name string) {
  method listenPolls (line 546) | func (t *Target) listenPolls(ctx context.Context) {
  method handleStreamSubscriptionRcv (line 563) | func (t *Target) handleStreamSubscriptionRcv(ctx context.Context, stream...
  method handleONCESubscriptionRcv (line 584) | func (t *Target) handleONCESubscriptionRcv(ctx context.Context, stream g...
  method handlePollSubscriptionRcv (line 609) | func (t *Target) handlePollSubscriptionRcv(ctx context.Context, stream g...

FILE: pkg/api/target/target.go
  type TargetError (line 31) | type TargetError struct
  type SubscribeResponse (line 37) | type SubscribeResponse struct
  type Target (line 44) | type Target struct
    method CreateGNMIClient (line 81) | func (t *Target) CreateGNMIClient(ctx context.Context, opts ...grpc.Di...
    method createDialer (line 138) | func (t *Target) createDialer(addr string) func(context.Context, strin...
    method createProxyDialer (line 153) | func (t *Target) createProxyDialer(addr string) func(context.Context, ...
    method createCustomDialer (line 168) | func (t *Target) createCustomDialer(addr string) func(context.Context,...
    method callOpts (line 188) | func (t *Target) callOpts() []grpc.CallOption {
    method appendRequestMetadata (line 218) | func (t *Target) appendRequestMetadata(ctx context.Context) context.Co...
    method appendCredentials (line 224) | func (t *Target) appendCredentials(ctx context.Context) context.Context {
    method appendMetadata (line 238) | func (t *Target) appendMetadata(ctx context.Context) context.Context {
    method Capabilities (line 247) | func (t *Target) Capabilities(ctx context.Context, ext ...*gnmi_ext.Ex...
    method Get (line 252) | func (t *Target) Get(ctx context.Context, req *gnmi.GetRequest) (*gnmi...
    method Set (line 257) | func (t *Target) Set(ctx context.Context, req *gnmi.SetRequest) (*gnmi...
    method StopSubscriptions (line 261) | func (t *Target) StopSubscriptions() {
    method Close (line 276) | func (t *Target) Close() error {
    method SubscribeClientStates (line 286) | func (t *Target) SubscribeClientStates() map[string]bool {
    method ConnState (line 300) | func (t *Target) ConnState() string {
    method WaitForConnStateChange (line 310) | func (t *Target) WaitForConnStateChange(ctx context.Context, sourceSta...
    method ConnectivityState (line 319) | func (t *Target) ConnectivityState() connectivity.State {
  function NewTarget (line 65) | func NewTarget(c *types.TargetConfig) *Target {

FILE: pkg/api/target_test.go
  type input (line 19) | type input struct
  function TestNewTarget (line 139) | func TestNewTarget(t *testing.T) {

FILE: pkg/api/testutils/utils.go
  function CapabilitiesResponsesEqual (line 20) | func CapabilitiesResponsesEqual(rsp1, rsp2 *gnmi.CapabilityResponse) bool {
  function GetRequestsEqual (line 49) | func GetRequestsEqual(req1, req2 *gnmi.GetRequest) bool {
  function SetRequestsEqual (line 85) | func SetRequestsEqual(req1, req2 *gnmi.SetRequest) bool {
  function SubscribeRequestsEqual (line 124) | func SubscribeRequestsEqual(req1, req2 *gnmi.SubscribeRequest) bool {
  function GetResponsesEqual (line 215) | func GetResponsesEqual(rsp1, rsp2 *gnmi.GetResponse) bool {
  function SetResponsesEqual (line 233) | func SetResponsesEqual(rsp1, rsp2 *gnmi.SetResponse) bool {
  function SubscribeResponsesEqual (line 251) | func SubscribeResponsesEqual(rsp1, rsp2 *gnmi.SubscribeResponse) bool {
  function GnmiPathsEqual (line 292) | func GnmiPathsEqual(p1, p2 *gnmi.Path) bool {
  function GnmiSubscriptionEqual (line 319) | func GnmiSubscriptionEqual(s1, s2 *gnmi.Subscription) bool {
  function GnmiUpdatesEqual (line 341) | func GnmiUpdatesEqual(u1, u2 *gnmi.Update) bool {
  function GnmiNotificationsEqual (line 357) | func GnmiNotificationsEqual(n1, n2 *gnmi.Notification) bool {
  function GnmiUpdateResultEqual (line 384) | func GnmiUpdateResultEqual(u1, u2 *gnmi.UpdateResult) bool {
  function GnmiValuesEqual (line 400) | func GnmiValuesEqual(v1, v2 *gnmi.TypedValue) bool {
  function RegisterOpEqual (line 603) | func RegisterOpEqual(r1, r2 *tpb.RegisterOp) bool {
  function TunnelDataEqual (line 675) | func TunnelDataEqual(r1, r2 *tpb.Data) bool {

FILE: pkg/api/tunnel.go
  type TunnelOption (line 21) | type TunnelOption
  function applyTunnelOpts (line 25) | func applyTunnelOpts(m proto.Message, opts ...TunnelOption) error {
  function NewRegisterOpTarget (line 34) | func NewRegisterOpTarget(opts ...TunnelOption) (*tpb.RegisterOp, error) {
  function NewRegisterOpSession (line 45) | func NewRegisterOpSession(opts ...TunnelOption) (*tpb.RegisterOp, error) {
  function NewRegisterOpSubscription (line 56) | func NewRegisterOpSubscription(opts ...TunnelOption) (*tpb.RegisterOp, e...
  function NewData (line 67) | func NewData(opts ...TunnelOption) (*tpb.Data, error) {
  function TunnelTarget (line 78) | func TunnelTarget(opts ...TunnelOption) func(msg proto.Message) error {
  function TunnelSession (line 101) | func TunnelSession(opts ...TunnelOption) func(msg proto.Message) error {
  function TunnelSubscription (line 124) | func TunnelSubscription(opts ...TunnelOption) func(msg proto.Message) er...
  function TargetOpRemove (line 148) | func TargetOpRemove() func(msg proto.Message) error {
  function Accept (line 163) | func Accept(b bool) func(msg proto.Message) error {
  function TargetName (line 182) | func TargetName(n string) func(msg proto.Message) error {
  function TargetType (line 199) | func TargetType(typ string) func(msg proto.Message) error {
  function Error (line 218) | func Error(e string) func(msg proto.Message) error {
  function TargetOpAdd (line 239) | func TargetOpAdd() func(msg proto.Message) error {
  function Tag (line 254) | func Tag(t int32) func(msg proto.Message) error {
  function SubscriptionOpSubscribe (line 273) | func SubscriptionOpSubscribe() func(msg proto.Message) error {
  function SubscriptionOpUnsubscribe (line 289) | func SubscriptionOpUnsubscribe() func(msg proto.Message) error {
  function Data (line 307) | func Data(d []byte) func(msg proto.Message) error {
  function Close (line 321) | func Close(b bool) func(msg proto.Message) error {

FILE: pkg/api/tunnel_test.go
  type registerOpInput (line 20) | type registerOpInput struct
  function TestNewRegister (line 229) | func TestNewRegister(t *testing.T) {
  type dataInput (line 295) | type dataInput struct
  function TestNewData (line 327) | func TestNewData(t *testing.T) {

FILE: pkg/api/types/sasl.go
  type SASL (line 3) | type SASL struct

FILE: pkg/api/types/subscription.go
  constant notApplicable (line 19) | notApplicable = "NA"
  type SubscriptionConfig (line 23) | type SubscriptionConfig struct
    method String (line 51) | func (sc *SubscriptionConfig) String() string {
    method PathsString (line 59) | func (sc *SubscriptionConfig) PathsString() string {
    method PrefixString (line 63) | func (sc *SubscriptionConfig) PrefixString() string {
    method ModeString (line 70) | func (sc *SubscriptionConfig) ModeString() string {
    method SampleIntervalString (line 77) | func (sc *SubscriptionConfig) SampleIntervalString() string {
    method ModelsString (line 87) | func (sc *SubscriptionConfig) ModelsString() string {
    method QosString (line 91) | func (sc *SubscriptionConfig) QosString() string {
    method HeartbeatIntervalString (line 98) | func (sc *SubscriptionConfig) HeartbeatIntervalString() string {
    method SuppressRedundantString (line 105) | func (sc *SubscriptionConfig) SuppressRedundantString() string {
    method UpdatesOnlyString (line 109) | func (sc *SubscriptionConfig) UpdatesOnlyString() string {
  type HistoryConfig (line 44) | type HistoryConfig struct

FILE: pkg/api/types/target.go
  function ciphersMap (line 34) | func ciphersMap() map[string]uint16 {
  type TargetConfig (line 123) | type TargetConfig struct
    method String (line 174) | func (tc TargetConfig) String() string {
    method DeepCopy (line 196) | func (tc *TargetConfig) DeepCopy() *TargetConfig {
    method SetTLSConfig (line 260) | func (tc *TargetConfig) SetTLSConfig(tlsConfig *tls.Config) {
    method NewTLSConfig (line 265) | func (tc *TargetConfig) NewTLSConfig() (*tls.Config, error) {
    method GrpcDialOptions (line 327) | func (tc *TargetConfig) GrpcDialOptions() ([]grpc.DialOption, error) {
    method UsernameString (line 403) | func (tc *TargetConfig) UsernameString() string {
    method PasswordString (line 410) | func (tc *TargetConfig) PasswordString() string {
    method InsecureString (line 417) | func (tc *TargetConfig) InsecureString() string {
    method TLSCAString (line 424) | func (tc *TargetConfig) TLSCAString() string {
    method TLSKeyString (line 431) | func (tc *TargetConfig) TLSKeyString() string {
    method TLSCertString (line 438) | func (tc *TargetConfig) TLSCertString() string {
    method SkipVerifyString (line 445) | func (tc *TargetConfig) SkipVerifyString() string {
    method SubscriptionString (line 452) | func (tc *TargetConfig) SubscriptionString() string {
    method OutputsString (line 456) | func (tc *TargetConfig) OutputsString() string {
    method BufferSizeString (line 460) | func (tc *TargetConfig) BufferSizeString() string {
    method getTLSMinVersion (line 464) | func (tc *TargetConfig) getTLSMinVersion() uint16 {
    method getTLSMaxVersion (line 472) | func (tc *TargetConfig) getTLSMaxVersion() uint16 {
    method Equal (line 495) | func (tc *TargetConfig) Equal(other *TargetConfig) bool {
  type ClientKeepalive (line 168) | type ClientKeepalive struct
  function clonePtr (line 188) | func clonePtr[T any](p *T) *T {
  function tlsVersionStringToUint (line 480) | func tlsVersionStringToUint(v string) uint16 {

FILE: pkg/api/types/tls.go
  type TLSConfig (line 5) | type TLSConfig struct
    method Validate (line 13) | func (t *TLSConfig) Validate() error {
    method Equal (line 29) | func (t *TLSConfig) Equal(other *TLSConfig) bool {

FILE: pkg/api/utils/tls.go
  function NewTLSConfig (line 33) | func NewTLSConfig(ca, cert, key, clientAuth string, skipVerify, genSelfS...
  function SelfSignedCerts (line 115) | func SelfSignedCerts() (tls.Certificate, error) {
  function ReadLocalFile (line 153) | func ReadLocalFile(ctx context.Context, path string) ([]byte, error) {
  function readFromStdin (line 184) | func readFromStdin(ctx context.Context) ([]byte, error) {
  function LoadCACertificates (line 209) | func LoadCACertificates(caPath string) (*x509.CertPool, error) {
  function loadCACertificatesToPool (line 241) | func loadCACertificatesToPool(filePath string, certPool *x509.CertPool) ...

FILE: pkg/api/utils/utils.go
  constant DefaultLoggingFlags (line 18) | DefaultLoggingFlags = log.LstdFlags | log.Lmicroseconds | log.Lmsgprefix
  function MergeMaps (line 21) | func MergeMaps(dst, src map[string]any) map[string]any {
  function mapify (line 41) | func mapify(i interface{}) (map[string]interface{}, bool) {
  function GetHost (line 53) | func GetHost(hostport string) string {
  function Convert (line 61) | func Convert(i interface{}) interface{} {

FILE: pkg/api/utils/utils_test.go
  function TestConvert (line 61) | func TestConvert(t *testing.T) {
  function TestMergeMaps (line 73) | func TestMergeMaps(t *testing.T) {

FILE: pkg/app/api.go
  method newAPIServer (line 35) | func (a *App) newAPIServer() (*http.Server, error) {
  type APIErrors (line 91) | type APIErrors struct
  method handleConfigTargetsGet (line 95) | func (a *App) handleConfigTargetsGet(w http.ResponseWriter, r *http.Requ...
  method handleConfigTargetsPost (line 130) | func (a *App) handleConfigTargetsPost(w http.ResponseWriter, r *http.Req...
  method handleConfigTargetsSubscriptions (line 148) | func (a *App) handleConfigTargetsSubscriptions(w http.ResponseWriter, r ...
  method handleConfigTargetsDelete (line 185) | func (a *App) handleConfigTargetsDelete(w http.ResponseWriter, r *http.R...
  method handleConfigSubscriptions (line 196) | func (a *App) handleConfigSubscriptions(w http.ResponseWriter, r *http.R...
  method handleConfigOutputs (line 200) | func (a *App) handleConfigOutputs(w http.ResponseWriter, r *http.Request) {
  method handleConfigClustering (line 204) | func (a *App) handleConfigClustering(w http.ResponseWriter, r *http.Requ...
  method handleConfigAPIServer (line 208) | func (a *App) handleConfigAPIServer(w http.ResponseWriter, r *http.Reque...
  method handleConfigGNMIServer (line 212) | func (a *App) handleConfigGNMIServer(w http.ResponseWriter, r *http.Requ...
  method handleConfigInputs (line 216) | func (a *App) handleConfigInputs(w http.ResponseWriter, r *http.Request) {
  method handleConfigProcessors (line 220) | func (a *App) handleConfigProcessors(w http.ResponseWriter, r *http.Requ...
  method handleConfig (line 224) | func (a *App) handleConfig(w http.ResponseWriter, r *http.Request) {
  method handleTargetsGet (line 249) | func (a *App) handleTargetsGet(w http.ResponseWriter, r *http.Request) {
  method handleTargetsPost (line 264) | func (a *App) handleTargetsPost(w http.ResponseWriter, r *http.Request) {
  method handleTargetsDelete (line 280) | func (a *App) handleTargetsDelete(w http.ResponseWriter, r *http.Request) {
  type clusteringResponse (line 300) | type clusteringResponse struct
  type clusterMember (line 307) | type clusterMember struct
  method handleClusteringGet (line 315) | func (a *App) handleClusteringGet(w http.ResponseWriter, r *http.Request) {
  method handleHealthzGet (line 374) | func (a *App) handleHealthzGet(w http.ResponseWriter, r *http.Request) {
  method handleAdminShutdown (line 389) | func (a *App) handleAdminShutdown(w http.ResponseWriter, r *http.Request) {
  method handleClusteringMembersGet (line 394) | func (a *App) handleClusteringMembersGet(w http.ResponseWriter, r *http....
  method handleClusteringLeaderGet (line 444) | func (a *App) handleClusteringLeaderGet(w http.ResponseWriter, r *http.R...
  method handleClusteringLeaderDelete (line 496) | func (a *App) handleClusteringLeaderDelete(w http.ResponseWriter, r *htt...
  method handleClusteringDrainInstance (line 515) | func (a *App) handleClusteringDrainInstance(w http.ResponseWriter, r *ht...
  method handleClusterRebalance (line 578) | func (a *App) handleClusterRebalance(w http.ResponseWriter, r *http.Requ...
  function headersMiddleware (line 598) | func headersMiddleware(next http.Handler) http.Handler {
  method loggingMiddleware (line 605) | func (a *App) loggingMiddleware(next http.Handler) http.Handler {
  method handlerCommonGet (line 614) | func (a *App) handlerCommonGet(w http.ResponseWriter, i interface{}) {
  method getLeaderName (line 630) | func (a *App) getLeaderName(ctx context.Context) (string, error) {
  method getInstanceTargets (line 639) | func (a *App) getInstanceTargets(ctx context.Context, instance string) (...
  function getServiceScheme (line 660) | func getServiceScheme(service *lockers.Service) string {

FILE: pkg/app/app.go
  constant defaultHTTPClientTimeout (line 58) | defaultHTTPClientTimeout = 5 * time.Second
  type App (line 65) | type App struct
    method Context (line 171) | func (a *App) Context() context.Context {
    method InitGlobalFlags (line 178) | func (a *App) InitGlobalFlags() {
    method PreRunE (line 237) | func (a *App) PreRunE(cmd *cobra.Command, args []string) error {
    method validateGlobals (line 278) | func (a *App) validateGlobals() error {
    method logConfigKVs (line 305) | func (a *App) logConfigKVs() {
    method PrintMsg (line 325) | func (a *App) PrintMsg(address string, msgName string, msg proto.Messa...
    method createCollectorDialOpts (line 375) | func (a *App) createCollectorDialOpts() {
    method watchConfig (line 402) | func (a *App) watchConfig() {
    method loadTargets (line 408) | func (a *App) loadTargets(e fsnotify.Event) {
    method startAPIServer (line 496) | func (a *App) startAPIServer() {
    method LoadProtoFiles (line 523) | func (a *App) LoadProtoFiles() (desc.Descriptor, error) {
    method GetTargets (line 545) | func (a *App) GetTargets() (map[string]*types.TargetConfig, error) {
    method CreateGNMIClient (line 575) | func (a *App) CreateGNMIClient(ctx context.Context, t *target.Target) ...
  function New (line 125) | func New() *App {

FILE: pkg/app/capabilities.go
  method CapPreRunE (line 23) | func (a *App) CapPreRunE(cmd *cobra.Command, _ []string) error {
  method CapRunE (line 34) | func (a *App) CapRunE(cmd *cobra.Command, args []string) error {
  method ReqCapabilities (line 63) | func (a *App) ReqCapabilities(ctx context.Context, tc *types.TargetConfi...
  method InitCapabilitiesFlags (line 88) | func (a *App) InitCapabilitiesFlags(cmd *cobra.Command) {

FILE: pkg/app/clustering.go
  constant defaultClusterName (line 32) | defaultClusterName = "default-cluster"
  constant retryTimer (line 33) | retryTimer         = 10 * time.Second
  constant lockWaitTime (line 34) | lockWaitTime       = 100 * time.Millisecond
  constant apiServiceName (line 35) | apiServiceName     = "gnmic-api"
  constant protocolTagName (line 36) | protocolTagName    = "__protocol"
  constant maxRebalanceLoop (line 37) | maxRebalanceLoop   = 100
  method InitLocker (line 45) | func (a *App) InitLocker() error {
  method leaderKey (line 69) | func (a *App) leaderKey() string {
  method inCluster (line 73) | func (a *App) inCluster() bool {
  method apiServiceRegistration (line 80) | func (a *App) apiServiceRegistration() {
  method startCluster (line 123) | func (a *App) startCluster() {
  method watchMembers (line 182) | func (a *App) watchMembers(ctx context.Context) {
  method updateServices (line 212) | func (a *App) updateServices(srvs []*lockers.Service) {
  method dispatchTargets (line 258) | func (a *App) dispatchTargets(ctx context.Context) {
  method dispatchTargetsOnce (line 282) | func (a *App) dispatchTargetsOnce(ctx context.Context) {
  method dispatchTarget (line 304) | func (a *App) dispatchTarget(ctx context.Context, tc *types.TargetConfig...
  method selectService (line 389) | func (a *App) selectService(tags []string, denied ...string) (*lockers.S...
  method getInstancesLoad (line 444) | func (a *App) getInstancesLoad(instances ...string) (map[string]int, err...
  method getLowLoadInstance (line 485) | func (a *App) getLowLoadInstance(load map[string]int) string {
  method getHighAndLowInstance (line 499) | func (a *App) getHighAndLowInstance(load map[string]int) (string, string) {
  method getTargetToInstanceMapping (line 516) | func (a *App) getTargetToInstanceMapping(ctx context.Context) (map[strin...
  method getInstanceToTargetsMapping (line 531) | func (a *App) getInstanceToTargetsMapping(ctx context.Context) (map[stri...
  method getInstancesTagsMatches (line 552) | func (a *App) getInstancesTagsMatches(tags []string) map[string]int {
  method getHighestTagsMatches (line 575) | func (a *App) getHighestTagsMatches(tagsCount map[string]int) []string {
  method deleteTarget (line 591) | func (a *App) deleteTarget(ctx context.Context, name string) error {
  method assignTarget (line 625) | func (a *App) assignTarget(ctx context.Context, tc *types.TargetConfig, ...
  method unassignTarget (line 668) | func (a *App) unassignTarget(ctx context.Context, name string, serviceID...
  method getServiceScheme (line 692) | func (a *App) getServiceScheme(service *lockers.Service) string {
  method createAPIClient (line 703) | func (a *App) createAPIClient() error {
  method clusterRebalanceTargets (line 738) | func (a *App) clusterRebalanceTargets() error {

FILE: pkg/app/clustering_test.go
  function TestGetInstancesTagsMatches (line 231) | func TestGetInstancesTagsMatches(t *testing.T) {
  function TestGetHighestTagsMatches (line 244) | func TestGetHighestTagsMatches(t *testing.T) {

FILE: pkg/app/const.go
  constant defaultGrpcPort (line 14) | defaultGrpcPort   = "57400"
  constant msgSize (line 15) | msgSize           = 512 * 1024 * 1024
  constant defaultRetryTimer (line 16) | defaultRetryTimer = 10 * time.Second
  constant defaultPprofAddr (line 17) | defaultPprofAddr  = "127.0.0.1:6060"
  constant formatJSON (line 19) | formatJSON      = "json"
  constant formatPROTOJSON (line 20) | formatPROTOJSON = "protojson"
  constant formatPROTOTEXT (line 21) | formatPROTOTEXT = "prototext"
  constant formatEvent (line 22) | formatEvent     = "event"
  constant formatPROTO (line 23) | formatPROTO     = "proto"
  constant formatFLAT (line 24) | formatFLAT      = "flat"

FILE: pkg/app/diff.go
  type targetDiffResponse (line 32) | type targetDiffResponse struct
  method InitDiffFlags (line 39) | func (a *App) InitDiffFlags(cmd *cobra.Command) {
  method DiffPreRunE (line 59) | func (a *App) DiffPreRunE(cmd *cobra.Command, args []string) error {
  method DiffRunE (line 77) | func (a *App) DiffRunE(cmd *cobra.Command, args []string) error {
  method diff (line 137) | func (a *App) diff(ctx context.Context, cmd *cobra.Command, ref *types.T...
  method subscribeBasedDiff (line 144) | func (a *App) subscribeBasedDiff(ctx context.Context, cmd *cobra.Command...
  method getBasedDiff (line 261) | func (a *App) getBasedDiff(ctx context.Context, ref *types.TargetConfig,...
  method responsesDiff (line 322) | func (a *App) responsesDiff(r1, r2 []proto.Message) error {
  type diff (line 354) | type diff struct
  type diffs (line 360) | type diffs
    method String (line 362) | func (ds diffs) String() string {

FILE: pkg/app/generate.go
  type keyOpts (line 32) | type keyOpts struct
    method format (line 37) | func (ko *keyOpts) format(s string) string {
  method GenerateRunE (line 47) | func (a *App) GenerateRunE(cmd *cobra.Command, args []string) error {
  method GeneratePreRunE (line 102) | func (a *App) GeneratePreRunE(cmd *cobra.Command, args []string) error {
  method yangFilesPreProcessing (line 110) | func (a *App) yangFilesPreProcessing() error {
  method GenerateSetRequestRunE (line 151) | func (a *App) GenerateSetRequestRunE(cmd *cobra.Command, args []string) ...
  method InitGenerateFlags (line 202) | func (a *App) InitGenerateFlags(cmd *cobra.Command) {
  method InitGenerateSetRequestFlags (line 218) | func (a *App) InitGenerateSetRequestFlags(cmd *cobra.Command) {
  method generateYangSchema (line 228) | func (a *App) generateYangSchema(files, excludes []string) error {
  method createSetRequestFile (line 287) | func (a *App) createSetRequestFile(m map[string]interface{}) (*config.Se...
  function buildRootEntry (line 332) | func buildRootEntry() *yang.Entry {
  function updateAnnotation (line 345) | func updateAnnotation(entry *yang.Entry) {
  function toMap (line 382) | func toMap(e *yang.Entry, configOnly bool, kopts *keyOpts) interface{} {
  function pathToUpdateItem (line 454) | func pathToUpdateItem(p string, m map[string]interface{}, kopts *keyOpts...
  function getSubMapByPath (line 462) | func getSubMapByPath(p string, m map[string]interface{}, kopts *keyOpts)...
  function resolveGlobs (line 509) | func resolveGlobs(globs []string) ([]string, error) {
  function walkDir (line 529) | func walkDir(path, ext string) ([]string, error) {
  function findYangFiles (line 554) | func findYangFiles(files []string) ([]string, error) {

FILE: pkg/app/generatePath.go
  method GeneratePathPreRunE (line 19) | func (a *App) GeneratePathPreRunE(cmd *cobra.Command, args []string) err...
  method GeneratePathRunE (line 30) | func (a *App) GeneratePathRunE(cmd *cobra.Command, args []string) error {
  method InitGeneratePathFlags (line 49) | func (a *App) InitGeneratePathFlags(cmd *cobra.Command) {

FILE: pkg/app/get.go
  method GetPreRunE (line 27) | func (a *App) GetPreRunE(cmd *cobra.Command, args []string) error {
  method GetRun (line 47) | func (a *App) GetRun(cmd *cobra.Command, args []string) error {
  method GetRequest (line 93) | func (a *App) GetRequest(ctx context.Context, tc *types.TargetConfig) {
  method getRequest (line 114) | func (a *App) getRequest(ctx context.Context, tc *types.TargetConfig, re...
  method getModels (line 148) | func (a *App) getModels(ctx context.Context, tc *types.TargetConfig) ([]...
  method filterModels (line 156) | func (a *App) filterModels(ctx context.Context, tc *types.TargetConfig, ...
  method InitGetFlags (line 198) | func (a *App) InitGetFlags(cmd *cobra.Command) {
  method intializeEventProcessors (line 217) | func (a *App) intializeEventProcessors() ([]formatters.EventProcessor, e...
  method handleGetRequestEvent (line 250) | func (a *App) handleGetRequestEvent(ctx context.Context, evps []formatte...
  type getResponseEvents (line 305) | type getResponseEvents struct

FILE: pkg/app/getset.go
  method GetSetPreRunE (line 28) | func (a *App) GetSetPreRunE(cmd *cobra.Command, args []string) error {
  method GetSetRunE (line 40) | func (a *App) GetSetRunE(cmd *cobra.Command, args []string) error {
  method GetSetRequest (line 73) | func (a *App) GetSetRequest(ctx context.Context, tc *types.TargetConfig,...
  method InitGetSetFlags (line 166) | func (a *App) InitGetSetFlags(cmd *cobra.Command) {

FILE: pkg/app/gnmi_client.go
  method ClientCapabilities (line 20) | func (a *App) ClientCapabilities(ctx context.Context, tc *types.TargetCo...
  method ClientGet (line 45) | func (a *App) ClientGet(ctx context.Context, tc *types.TargetConfig, req...
  method ClientSet (line 68) | func (a *App) ClientSet(ctx context.Context, tc *types.TargetConfig, req...

FILE: pkg/app/gnmi_client_subscribe.go
  type subscriptionRequest (line 31) | type subscriptionRequest struct
  method TargetSubscribeStream (line 38) | func (a *App) TargetSubscribeStream(ctx context.Context, tc *types.Targe...
  method TargetSubscribeOnce (line 113) | func (a *App) TargetSubscribeOnce(ctx context.Context, tc *types.TargetC...
  method TargetSubscribePoll (line 132) | func (a *App) TargetSubscribePoll(ctx context.Context, tc *types.TargetC...
  method clientSubscribe (line 153) | func (a *App) clientSubscribe(ctx context.Context, tc *types.TargetConfi...
  method clientSubscribeOnce (line 224) | func (a *App) clientSubscribeOnce(ctx context.Context, tc *types.TargetC...
  method clientSubscribePoll (line 300) | func (a *App) clientSubscribePoll(ctx context.Context, targetName, subsc...

FILE: pkg/app/gnmi_server.go
  type streamClient (line 36) | type streamClient struct
  method startGnmiServer (line 44) | func (a *App) startGnmiServer() error {
  method registerGNMIServer (line 93) | func (a *App) registerGNMIServer(ctx context.Context, defaultTags ...str...
  method handleONCESubscriptionRequest (line 195) | func (a *App) handleONCESubscriptionRequest(sc *streamClient) {
  method handleStreamSubscriptionRequest (line 245) | func (a *App) handleStreamSubscriptionRequest(sc *streamClient) {
  method handlePolledSubscription (line 373) | func (a *App) handlePolledSubscription(sc *streamClient) {
  method handlegNMIcInternalGet (line 410) | func (a *App) handlegNMIcInternalGet(ctx context.Context, req *gnmi.GetR...
  method handlegNMIGetPath (line 431) | func (a *App) handlegNMIGetPath(elems []*gnmi.PathElem, enc gnmi.Encodin...
  function targetConfigToNotification (line 480) | func targetConfigToNotification(tc *types.TargetConfig, e gnmi.Encoding)...
  function subscriptionConfigToNotification (line 812) | func subscriptionConfigToNotification(sub *types.SubscriptionConfig, e g...
  method serverGetHandler (line 842) | func (a *App) serverGetHandler(ctx context.Context, req *gnmi.GetRequest...
  method serverSetHandler (line 944) | func (a *App) serverSetHandler(ctx context.Context, req *gnmi.SetRequest...
  method serverSubscribeHandler (line 1028) | func (a *App) serverSubscribeHandler(req *gnmi.SubscribeRequest, stream ...

FILE: pkg/app/inputs.go
  method InitInput (line 18) | func (a *App) InitInput(ctx context.Context, name string, tcs map[string...
  method InitInputs (line 48) | func (a *App) InitInputs(ctx context.Context) {

FILE: pkg/app/loaders.go
  method startLoader (line 19) | func (a *App) startLoader(ctx context.Context) {
  method startLoaderProxy (line 113) | func (a *App) startLoaderProxy(ctx context.Context) {

FILE: pkg/app/locker.go
  method targetLockKey (line 13) | func (a *App) targetLockKey(s string) string {

FILE: pkg/app/logging.go
  method logError (line 17) | func (a *App) logError(err error) {
  method checkErrors (line 31) | func (a *App) checkErrors() error {

FILE: pkg/app/metrics.go
  constant clusterMetricsUpdatePeriod (line 21) | clusterMetricsUpdatePeriod = 10 * time.Second
  method registerTargetMetrics (line 68) | func (a *App) registerTargetMetrics() {
  method startClusterMetrics (line 150) | func (a *App) startClusterMetrics() {

FILE: pkg/app/outputs.go
  method InitOutput (line 20) | func (a *App) InitOutput(ctx context.Context, name string, tcs map[strin...
  method InitOutputs (line 55) | func (a *App) InitOutputs(ctx context.Context) {
  method AddOutputConfig (line 62) | func (a *App) AddOutputConfig(name string, cfg map[string]interface{}) e...
  method DeleteOutput (line 78) | func (a *App) DeleteOutput(name string) error {

FILE: pkg/app/path.go
  type pathGenOpts (line 27) | type pathGenOpts struct
  type generatedPath (line 39) | type generatedPath struct
  method PathCmdRun (line 51) | func (a *App) PathCmdRun(d, f, e []string, pgo pathGenOpts) error {
  method PathPreRunE (line 167) | func (a *App) PathPreRunE(cmd *cobra.Command, args []string) error {
  method PathRunE (line 178) | func (a *App) PathRunE(cmd *cobra.Command, args []string) error {
  method InitPathFlags (line 195) | func (a *App) InitPathFlags(cmd *cobra.Command) {
  function collectSchemaNodes (line 208) | func collectSchemaNodes(e *yang.Entry, leafOnly bool) []*yang.Entry {
  method generatePath (line 280) | func (a *App) generatePath(entry *yang.Entry, pType string) *generatedPa...
  method generateTypeInfo (line 352) | func (a *App) generateTypeInfo(e *yang.Entry) string {
  function getAnnotation (line 428) | func getAnnotation(entry *yang.Entry, name string) any {
  function isState (line 438) | func isState(e *yang.Entry) bool {
  function collapsePrefixes (line 449) | func collapsePrefixes(p string) string {
  function getPrefixElem (line 469) | func getPrefixElem(pe string) (string, string) {

FILE: pkg/app/path_test.go
  function TestCollapsePrefixes (line 40) | func TestCollapsePrefixes(t *testing.T) {

FILE: pkg/app/plugins.go
  method initPluginManager (line 5) | func (a *App) initPluginManager() error {
  method CleanupPlugins (line 17) | func (a *App) CleanupPlugins() {

FILE: pkg/app/pprof.go
  type pprofServer (line 9) | type pprofServer struct
    method Start (line 19) | func (p *pprofServer) Start(address string) {
    method ErrChan (line 33) | func (p *pprofServer) ErrChan() <-chan error {
  function newPprofServer (line 13) | func newPprofServer() *pprofServer {

FILE: pkg/app/processor.go
  method ProcessorPreRunE (line 20) | func (a *App) ProcessorPreRunE(cmd *cobra.Command, args []string) error {
  method ProcessorRunE (line 30) | func (a *App) ProcessorRunE(cmd *cobra.Command, args []string) error {
  method InitProcessorFlags (line 115) | func (a *App) InitProcessorFlags(cmd *cobra.Command) {
  method promFormat (line 126) | func (a *App) promFormat(rrevs [][]*formatters.EventMsg, outName string)...

FILE: pkg/app/prompt.go
  method PromptRunE (line 23) | func (a *App) PromptRunE(cmd *cobra.Command, args []string) error {
  method PromptPreRunE (line 58) | func (a *App) PromptPreRunE(cmd *cobra.Command, args []string) error {
  method InitPromptFlags (line 81) | func (a *App) InitPromptFlags(cmd *cobra.Command) {

FILE: pkg/app/proxy.go
  type targetSubscribeResponse (line 36) | type targetSubscribeResponse struct
  method ProxyPreRunE (line 41) | func (a *App) ProxyPreRunE(cmd *cobra.Command, args []string) error {
  method ProxyRunE (line 47) | func (a *App) ProxyRunE(cmd *cobra.Command, args []string) error {
  method startGNMIProxyServer (line 85) | func (a *App) startGNMIProxyServer(ctx context.Context) error {
  method proxyGetHandler (line 110) | func (a *App) proxyGetHandler(ctx context.Context, req *gnmi.GetRequest)...
  method proxySetHandler (line 197) | func (a *App) proxySetHandler(ctx context.Context, req *gnmi.SetRequest)...
  method proxySubscribeHandler (line 281) | func (a *App) proxySubscribeHandler(req *gnmi.SubscribeRequest, stream g...
  method proxySubscribeONCEHandler (line 318) | func (a *App) proxySubscribeONCEHandler(req *gnmi.SubscribeRequest, stre...
  method proxySubscribeSTREAMHandler (line 424) | func (a *App) proxySubscribeSTREAMHandler(req *gnmi.SubscribeRequest, st...
  function getTargetFromSubscribeRequest (line 522) | func getTargetFromSubscribeRequest(req *gnmi.SubscribeRequest) string {
  method selectTargets (line 531) | func (a *App) selectTargets(ctx context.Context, tn string) (map[string]...
  method createTarget (line 587) | func (a *App) createTarget(ctx context.Context, tc *types.TargetConfig) ...

FILE: pkg/app/routes.go
  method routes (line 17) | func (a *App) routes() {
  method clusterRoutes (line 26) | func (a *App) clusterRoutes(r *mux.Router) {
  method configRoutes (line 35) | func (a *App) configRoutes(r *mux.Router) {
  method targetRoutes (line 60) | func (a *App) targetRoutes(r *mux.Router) {
  method healthRoutes (line 68) | func (a *App) healthRoutes(r *mux.Router) {
  method adminRoutes (line 72) | func (a *App) adminRoutes(r *mux.Router) {

FILE: pkg/app/set-to-notifs.go
  method InitDiffSetToNotifsFlags (line 29) | func (a *App) InitDiffSetToNotifsFlags(cmd *cobra.Command) {
  method DiffSetToNotifsRunE (line 43) | func (a *App) DiffSetToNotifsRunE(cmd *cobra.Command, args []string) err...

FILE: pkg/app/set.go
  method SetPreRunE (line 24) | func (a *App) SetPreRunE(cmd *cobra.Command, args []string) error {
  method SetRunE (line 40) | func (a *App) SetRunE(cmd *cobra.Command, args []string) error {
  method SetRequest (line 72) | func (a *App) SetRequest(ctx context.Context, tc *types.TargetConfig) {
  method setRequest (line 84) | func (a *App) setRequest(ctx context.Context, tc *types.TargetConfig, re...
  method InitSetFlags (line 108) | func (a *App) InitSetFlags(cmd *cobra.Command) {

FILE: pkg/app/setrequest.go
  method InitDiffSetRequestFlags (line 29) | func (a *App) InitDiffSetRequestFlags(cmd *cobra.Command) {
  method DiffSetRequestRunE (line 43) | func (a *App) DiffSetRequestRunE(cmd *cobra.Command, args []string) error {

FILE: pkg/app/subscribe.go
  constant initLockerRetryTimer (line 37) | initLockerRetryTimer = 1 * time.Second
  method SubscribePreRunE (line 40) | func (a *App) SubscribePreRunE(cmd *cobra.Command, args []string) error {
  method SubscribeRunE (line 52) | func (a *App) SubscribeRunE(cmd *cobra.Command, args []string) error {
  method subscribeStream (line 145) | func (a *App) subscribeStream(ctx context.Context, tc *types.TargetConfi...
  method subscribeOnce (line 150) | func (a *App) subscribeOnce(ctx context.Context, tc *types.TargetConfig) {
  method subscribePoll (line 158) | func (a *App) subscribePoll(ctx context.Context, tc *types.TargetConfig) {
  method InitSubscribeFlags (line 164) | func (a *App) InitSubscribeFlags(cmd *cobra.Command) {
  method readConfigs (line 197) | func (a *App) readConfigs() error {
  constant subscriptionModeONCE (line 223) | subscriptionModeONCE = "ONCE"
  constant subscriptionModePOLL (line 224) | subscriptionModePOLL = "POLL"
  method StartTargetsManager (line 227) | func (a *App) StartTargetsManager(ctx context.Context) {
  method export (line 346) | func (a *App) export(ctx context.Context, rsp *gnmi.SubscribeResponse, m...
  method updateCache (line 381) | func (a *App) updateCache(ctx context.Context, rsp *gnmi.SubscribeRespon...
  method subscriptionMode (line 407) | func (a *App) subscriptionMode(name string) string {
  method polledSubscriptionsTargets (line 415) | func (a *App) polledSubscriptionsTargets() map[string][]string {
  method handlePolledSubscriptions (line 430) | func (a *App) handlePolledSubscriptions() error {
  method startIO (line 564) | func (a *App) startIO() {
  function allSubscriptionsModeOnce (line 592) | func allSubscriptionsModeOnce(subs map[string]*types.SubscriptionConfig)...
  function allSubscriptionsModePoll (line 604) | func allSubscriptionsModePoll(subs map[string]*types.SubscriptionConfig)...

FILE: pkg/app/subscribe_once.go
  method SubscribeRunONCE (line 19) | func (a *App) SubscribeRunONCE(_ *cobra.Command, _ []string) error {

FILE: pkg/app/subscribe_poll.go
  method SubscribeRunPoll (line 18) | func (a *App) SubscribeRunPoll(cmd *cobra.Command, args []string) error {

FILE: pkg/app/subscribe_prompt.go
  method SubscribeRunPrompt (line 19) | func (a *App) SubscribeRunPrompt(cmd *cobra.Command, args []string) error {

FILE: pkg/app/target.go
  method initTarget (line 24) | func (a *App) initTarget(tc *types.TargetConfig) (*target.Target, error) {
  method stopTarget (line 48) | func (a *App) stopTarget(ctx context.Context, name string) error {
  method DeleteTarget (line 68) | func (a *App) DeleteTarget(ctx context.Context, name string) error {
  method UpdateTargetSubscription (line 99) | func (a *App) UpdateTargetSubscription(ctx context.Context, name string,...
  method AddTargetConfig (line 120) | func (a *App) AddTargetConfig(tc *types.TargetConfig) {
  method parseProtoFiles (line 138) | func (a *App) parseProtoFiles(t *target.Target) error {
  method targetConfigExists (line 158) | func (a *App) targetConfigExists(name string) bool {

FILE: pkg/app/tree.go
  method InitTreeFlags (line 11) | func (a *App) InitTreeFlags(cmd *cobra.Command) {
  method RunETree (line 22) | func (a *App) RunETree(cmd *cobra.Command, args []string) error {
  method tree (line 31) | func (a *App) tree(c *cobra.Command, indent string) error {
  function treeFlat (line 68) | func treeFlat(c *cobra.Command, prefix string) {

FILE: pkg/app/tunnel.go
  method initTunnelServer (line 30) | func (a *App) initTunnelServer(tsc tunnel.ServerConfig) error {
  method startTunnelServer (line 47) | func (a *App) startTunnelServer(tsc tunnel.ServerConfig) error {
  method gRPCTunnelServerOpts (line 99) | func (a *App) gRPCTunnelServerOpts() ([]grpc.ServerOption, error) {
  method tunServerAddTargetHandler (line 132) | func (a *App) tunServerAddTargetHandler(tt tunnel.Target) error {
  method tunServerAddTargetSubscribeHandler (line 145) | func (a *App) tunServerAddTargetSubscribeHandler(tt tunnel.Target) error {
  method tunServerDeleteTargetHandler (line 169) | func (a *App) tunServerDeleteTargetHandler(tt tunnel.Target) error {
  method tunServerRegisterHandler (line 184) | func (a *App) tunServerRegisterHandler(ss tunnel.ServerSession) error {
  method tunServerHandler (line 188) | func (a *App) tunServerHandler(ss tunnel.ServerSession, rwc io.ReadWrite...
  method tunDialerFn (line 193) | func (a *App) tunDialerFn(ctx context.Context, tc *types.TargetConfig) f...
  method getTunnelTargetMatch (line 211) | func (a *App) getTunnelTargetMatch(tt tunnel.Target) *types.TargetConfig {

FILE: pkg/app/utils.go
  method printCapResponse (line 18) | func (a *App) printCapResponse(printPrefix string, msg *gnmi.CapabilityR...
  function indent (line 45) | func indent(prefix, s string) string {

FILE: pkg/app/version.go
  method VersionRun (line 27) | func (a *App) VersionRun(cmd *cobra.Command, args []string) {
  method VersionUpgradeRun (line 53) | func (a *App) VersionUpgradeRun(cmd *cobra.Command, args []string) error {
  function downloadFile (line 82) | func downloadFile(url string, file *os.File) error {

FILE: pkg/cache/cache.go
  type CacheType (line 22) | type CacheType
  constant cacheType_OC (line 25) | cacheType_OC    CacheType = "oc"
  constant cacheType_Redis (line 26) | cacheType_Redis CacheType = "redis"
  constant cacheType_NATS (line 27) | cacheType_NATS  CacheType = "nats"
  constant cacheType_JS (line 28) | cacheType_JS    CacheType = "jetstream"
  constant ReadMode_Once (line 32) | ReadMode_Once           = "once"
  constant ReadMode_StreamOnChange (line 33) | ReadMode_StreamOnChange = "stream_on_change"
  constant ReadMode_StreamSample (line 34) | ReadMode_StreamSample   = "stream_sample"
  type Cache (line 37) | type Cache interface
  type Config (line 54) | type Config struct
    method setDefaults (line 71) | func (c *Config) setDefaults() {
  function New (line 105) | func New(c *Config, opts ...Option) (Cache, error) {
  type ReadOpts (line 126) | type ReadOpts struct
    method setDefaults (line 141) | func (ro *ReadOpts) setDefaults() {
  type Notification (line 160) | type Notification struct

FILE: pkg/cache/jetstream_cache.go
  constant loggingPrefixJetStream (line 32) | loggingPrefixJetStream = "[cache:jetstream] "
  constant reconnectTimer (line 33) | reconnectTimer         = 5 * time.Second
  constant defaultFetchBatchSize (line 34) | defaultFetchBatchSize  = 100
  constant defaultFetchWaitTime (line 35) | defaultFetchWaitTime   = 100 * time.Millisecond
  constant defaultExpiration (line 36) | defaultExpiration      = time.Minute
  constant defaultMaxMsgs (line 37) | defaultMaxMsgs         = 1024 * 1024
  constant defaultMaxBytes (line 38) | defaultMaxBytes        = 1024 * 1024 * 1024
  constant defaultNATSAddress (line 39) | defaultNATSAddress     = "127.0.0.1"
  constant jetStreamSyncName (line 40) | jetStreamSyncName      = "gnmic-jetstream-cache"
  type jetStreamCache (line 43) | type jetStreamCache struct
    method SetLogger (line 100) | func (c *jetStreamCache) SetLogger(logger *log.Logger) {
    method start (line 108) | func (c *jetStreamCache) start() {
    method createStream (line 159) | func (c *jetStreamCache) createStream(streamName string, subjects []st...
    method Write (line 186) | func (c *jetStreamCache) Write(ctx context.Context, subscriptionName s...
    method writeRemoteJS (line 203) | func (c *jetStreamCache) writeRemoteJS(ctx context.Context, subscripti...
    method publishNotificationJS (line 245) | func (c *jetStreamCache) publishNotificationJS(ctx context.Context, su...
    method sync (line 266) | func (c *jetStreamCache) sync(ctx context.Context) {
    method syncStream (line 298) | func (c *jetStreamCache) syncStream(ctx context.Context, subject strin...
    method ReadAll (line 324) | func (c *jetStreamCache) ReadAll() (map[string][]*gnmi.Notification, e...
    method Read (line 328) | func (c *jetStreamCache) Read(sub, target string, p *gnmi.Path) (map[s...
    method Subscribe (line 332) | func (c *jetStreamCache) Subscribe(ctx context.Context, ro *ReadOpts) ...
    method Stop (line 336) | func (c *jetStreamCache) Stop() {
    method DeleteTarget (line 346) | func (c *jetStreamCache) DeleteTarget(name string) {
  function newJetStreamCache (line 60) | func newJetStreamCache(cfg *Config, opts ...Option) (*jetStreamCache, er...
  function subjectName (line 356) | func subjectName(streamName, target string, m proto.Message) (string, er...
  type subjectOpts (line 393) | type subjectOpts struct
  function gNMIPathToSubject (line 398) | func gNMIPathToSubject(p *gnmi.Path, opts subjectOpts) []string {
  constant dotReplChar (line 444) | dotReplChar   = "^"
  constant spaceReplChar (line 445) | spaceReplChar = "~"
  function sanitizeKey (line 451) | func sanitizeKey(k string) string {

FILE: pkg/cache/jetstream_cache_test.go
  function Test_natsCache_Write (line 22) | func Test_natsCache_Write(t *testing.T) {

FILE: pkg/cache/nats_cache.go
  constant loggingPrefixNATS (line 28) | loggingPrefixNATS       = "[cache:nats] "
  constant cacheSubjects (line 29) | cacheSubjects           = "gnmic.cache.subjects"
  constant subjectCacheResetPeriod (line 30) | subjectCacheResetPeriod = 30 * time.Second
  type natsCache (line 33) | type natsCache struct
    method start (line 91) | func (c *natsCache) start() {
    method sync (line 136) | func (c *natsCache) sync(ctx context.Context) {
    method syncSubject (line 178) | func (c *natsCache) syncSubject(ctx context.Context, subject string) {
    method Write (line 199) | func (c *natsCache) Write(ctx context.Context, subscriptionName string...
    method writeRemoteNATS (line 217) | func (c *natsCache) writeRemoteNATS(ctx context.Context, subscriptionN...
    method publishNotificationNATS (line 237) | func (c *natsCache) publishNotificationNATS(_ context.Context, subscri...
    method ReadAll (line 249) | func (c *natsCache) ReadAll() (map[string][]*gnmi.Notification, error) {
    method Read (line 253) | func (c *natsCache) Read(sub, target string, p *gnmi.Path) (map[string...
    method Subscribe (line 257) | func (c *natsCache) Subscribe(ctx context.Context, ro *ReadOpts) chan ...
    method Stop (line 261) | func (c *natsCache) Stop() {
    method SetLogger (line 271) | func (c *natsCache) SetLogger(logger *log.Logger) {
    method DeleteTarget (line 279) | func (c *natsCache) DeleteTarget(name string) {
  function newNATSCache (line 51) | func newNATSCache(cfg *Config, opts ...Option) (*natsCache, error) {

FILE: pkg/cache/oc_cache.go
  constant loggingPrefixOC (line 31) | loggingPrefixOC = "[cache:oc] "
  constant defaultTimeout (line 32) | defaultTimeout  = 10 * time.Second
  type gnmiCache (line 35) | type gnmiCache struct
    method loadConfig (line 50) | func (gc *gnmiCache) loadConfig(gcc *Config) {
    method SetLogger (line 90) | func (gc *gnmiCache) SetLogger(logger *log.Logger) {
    method Write (line 97) | func (gc *gnmiCache) Write(ctx context.Context, measName string, m pro...
    method ReadAll (line 163) | func (gc *gnmiCache) ReadAll() (map[string][]*gnmi.Notification, error) {
    method Read (line 167) | func (gc *gnmiCache) Read(sub, target string, p *gnmi.Path) (map[strin...
    method Subscribe (line 171) | func (gc *gnmiCache) Subscribe(ctx context.Context, ro *ReadOpts) chan...
    method subscribe (line 183) | func (gc *gnmiCache) subscribe(ctx context.Context, ro *ReadOpts, ch c...
    method handleSingleQuery (line 196) | func (gc *gnmiCache) handleSingleQuery(ctx context.Context, ro *ReadOp...
    method handleSampledQuery (line 296) | func (gc *gnmiCache) handleSampledQuery(ctx context.Context, ro *ReadO...
    method handleOnChangeQuery (line 314) | func (gc *gnmiCache) handleOnChangeQuery(ctx context.Context, ro *Read...
    method Stop (line 384) | func (gc *gnmiCache) Stop() {}
    method read (line 386) | func (gc *gnmiCache) read(sub, target string, p *gnmi.Path) map[string...
    method getCaches (line 448) | func (gc *gnmiCache) getCaches(names ...string) map[string]*subCache {
    method DeleteTarget (line 468) | func (gc *gnmiCache) DeleteTarget(name string) {
  type subCache (line 45) | type subCache struct
    method update (line 80) | func (gc *subCache) update(n *ctree.Leaf) {
  function newGNMICache (line 56) | func newGNMICache(cfg *Config, loggingPrefix string, opts ...Option) *gn...
  type matchClient (line 476) | type matchClient struct
    method Update (line 481) | func (m *matchClient) Update(n interface{}) {

FILE: pkg/cache/oc_cache_test.go
  function Test_gnmiCache_read (line 20) | func Test_gnmiCache_read(t *testing.T) {

FILE: pkg/cache/options.go
  type Option (line 13) | type Option
  function WithLogger (line 15) | func WithLogger(logger *log.Logger) Option {

FILE: pkg/cache/redis_cache.go
  constant loggingPrefixRedis (line 28) | loggingPrefixRedis   = "[cache:redis] "
  constant cacheChannelsChannel (line 29) | cacheChannelsChannel = "gnmic_cache_channels"
  constant defaultRedisAddress (line 30) | defaultRedisAddress  = "127.0.0.1:6379"
  type redisCache (line 33) | type redisCache struct
    method SetLogger (line 91) | func (c *redisCache) SetLogger(logger *log.Logger) {
    method Write (line 99) | func (c *redisCache) Write(ctx context.Context, subscriptionName strin...
    method writeRemoteREDIS (line 117) | func (c *redisCache) writeRemoteREDIS(ctx context.Context, subscriptio...
    method publishNotificationREDIS (line 137) | func (c *redisCache) publishNotificationREDIS(ctx context.Context, sub...
    method ReadAll (line 159) | func (c *redisCache) ReadAll() (map[string][]*gnmi.Notification, error) {
    method Read (line 163) | func (c *redisCache) Read(sub, target string, p *gnmi.Path) (map[strin...
    method sync (line 167) | func (c *redisCache) sync(ctx context.Context) {
    method syncChannel (line 211) | func (c *redisCache) syncChannel(ctx context.Context, channel string) {
    method Subscribe (line 235) | func (c *redisCache) Subscribe(ctx context.Context, ro *ReadOpts) chan...
    method Stop (line 239) | func (c *redisCache) Stop() {
    method DeleteTarget (line 246) | func (c *redisCache) DeleteTarget(name string) {
  function newRedisCache (line 45) | func newRedisCache(cfg *Config, opts ...Option) (*redisCache, error) {

FILE: pkg/cmd/capabilities/capabilities.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/collector/collector.go
  function New (line 25) | func New(gApp *app.App) *cobra.Command {
  function getAPIServerURL (line 47) | func getAPIServerURL(store store.Store[any]) (string, error) {
  function getAPIServerClient (line 68) | func getAPIServerClient(store store.Store[any]) (*http.Client, error) {

FILE: pkg/cmd/collector/inputs.go
  function newCollectorInputsCmd (line 25) | func newCollectorInputsCmd(gApp *app.App) *cobra.Command {
  function newCollectorInputsListCmd (line 41) | func newCollectorInputsListCmd(gApp *app.App) *cobra.Command {
  function newCollectorInputsGetCmd (line 111) | func newCollectorInputsGetCmd(gApp *app.App) *cobra.Command {
  function newCollectorInputsSetCmd (line 180) | func newCollectorInputsSetCmd(gApp *app.App) *cobra.Command {
  function newCollectorInputsDeleteCmd (line 231) | func newCollectorInputsDeleteCmd(gApp *app.App) *cobra.Command {
  function tableFormatInputVertical (line 277) | func tableFormatInputVertical(input map[string]any) [][]string {
  function tableFormatInputsList (line 297) | func tableFormatInputsList(inputs []map[string]any) [][]string {

FILE: pkg/cmd/collector/ouputs.go
  function newCollectorOutputsCmd (line 25) | func newCollectorOutputsCmd(gApp *app.App) *cobra.Command {
  function newCollectorOutputsListCmd (line 43) | func newCollectorOutputsListCmd(gApp *app.App) *cobra.Command {
  function newCollectorOutputsGetCmd (line 111) | func newCollectorOutputsGetCmd(gApp *app.App) *cobra.Command {
  function newCollectorOutputsSetCmd (line 179) | func newCollectorOutputsSetCmd(gApp *app.App) *cobra.Command {
  function newCollectorOutputsDeleteCmd (line 229) | func newCollectorOutputsDeleteCmd(gApp *app.App) *cobra.Command {
  function tableFormatOutputVertical (line 274) | func tableFormatOutputVertical(output map[string]any) [][]string {
  function tableFormatOutputsList (line 295) | func tableFormatOutputsList(outputs []map[string]any) [][]string {

FILE: pkg/cmd/collector/processors.go
  function newCollectorProcessorsCmd (line 17) | func newCollectorProcessorsCmd(gApp *app.App) *cobra.Command {
  function newCollectorProcessorsListCmd (line 33) | func newCollectorProcessorsListCmd(gApp *app.App) *cobra.Command {
  function newCollectorProcessorsGetCmd (line 97) | func newCollectorProcessorsGetCmd(gApp *app.App) *cobra.Command {
  function newCollectorProcessorsSetCmd (line 163) | func newCollectorProcessorsSetCmd(gApp *app.App) *cobra.Command {
  function newCollectorProcessorsDeleteCmd (line 173) | func newCollectorProcessorsDeleteCmd(gApp *app.App) *cobra.Command {
  function tableFormatProcessorsList (line 183) | func tableFormatProcessorsList(processors []apiserver.ProcessorConfigRes...
  function tableFormatProcessorVertical (line 195) | func tableFormatProcessorVertical(processor apiserver.ProcessorConfigRes...
  function formatProcessorConfig (line 201) | func formatProcessorConfig(config any) string {

FILE: pkg/cmd/collector/subscriptions.go
  function newCollectorSubscriptionsCmd (line 31) | func newCollectorSubscriptionsCmd(gApp *app.App) *cobra.Command {
  function newCollectorSubscriptionsListCmd (line 50) | func newCollectorSubscriptionsListCmd(gApp *app.App) *cobra.Command {
  function newCollectorSubscriptionsGetCmd (line 118) | func newCollectorSubscriptionsGetCmd(gApp *app.App) *cobra.Command {
  function newCollectorSubscriptionsSetCmd (line 184) | func newCollectorSubscriptionsSetCmd(gApp *app.App) *cobra.Command {
  function newCollectorSubscriptionsDeleteCmd (line 229) | func newCollectorSubscriptionsDeleteCmd(gApp *app.App) *cobra.Command {
  function formatSubscriptionMode (line 274) | func formatSubscriptionMode(sub *types.SubscriptionConfig) string {
  function formatSubscriptionConfigVertical (line 290) | func formatSubscriptionConfigVertical(prefix string, cfg *types.Subscrip...
  function formatStreamSubscriptionConfigVertical (line 328) | func formatStreamSubscriptionConfigVertical(prefix string, cfg *types.Su...
  function tableFormatSubscriptionVertical (line 343) | func tableFormatSubscriptionVertical(sub *apiserver.SubscriptionResponse...
  function tableFormatSubscriptionsList (line 385) | func tableFormatSubscriptionsList(subs []*apiserver.SubscriptionResponse...
  function formatSubscriptionRow (line 416) | func formatSubscriptionRow(
  function readSubscriptionConfigFromFile (line 464) | func readSubscriptionConfigFromFile(filename string) (*types.Subscriptio...
  function formatSubscriptionEncoding (line 497) | func formatSubscriptionEncoding(encoding *string) string {

FILE: pkg/cmd/collector/targets.go
  function newCollectorTargetsCmd (line 31) | func newCollectorTargetsCmd(gApp *app.App) *cobra.Command {
  function newCollectorTargetsListCmd (line 48) | func newCollectorTargetsListCmd(gApp *app.App) *cobra.Command {
  function newCollectorTargetsGetCmd (line 108) | func newCollectorTargetsGetCmd(gApp *app.App) *cobra.Command {
  function newCollectorTargetsSetCmd (line 178) | func newCollectorTargetsSetCmd(gApp *app.App) *cobra.Command {
  function newCollectorTargetsDeleteCmd (line 219) | func newCollectorTargetsDeleteCmd(gApp *app.App) *cobra.Command {
  function formatValue (line 263) | func formatValue(v any) string {
  function formatValueShort (line 329) | func formatValueShort(v any) string {
  function tableFormatTargetVertical (line 351) | func tableFormatTargetVertical(target *apiserver.TargetResponse) [][]str...
  function tableFormatTargetsList (line 393) | func tableFormatTargetsList(targets []*apiserver.TargetResponse) [][]str...
  function readTargetConfigFromFile (line 414) | func readTargetConfigFromFile(filename string) (*types.TargetConfig, []b...

FILE: pkg/cmd/completion.go
  function newCompletionCmd (line 19) | func newCompletionCmd(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/diff/diff.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {
  function newDiffSetRequestCmd (line 33) | func newDiffSetRequestCmd(gApp *app.App) *cobra.Command {
  function newDiffSetToNotifsCmd (line 44) | func newDiffSetToNotifsCmd(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/generate/generate.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/generate/generatePath.go
  function newGeneratePathCmd (line 17) | func newGeneratePathCmd(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/generate/generateSetRequest.go
  function newGenerateSetRequestCmd (line 17) | func newGenerateSetRequestCmd(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/get/get.go
  function New (line 25) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/getset/getset.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/listener/listener.go
  function New (line 40) | func New(gApp *app.App) *cobra.Command {
  type dialoutTelemetryServer (line 171) | type dialoutTelemetryServer struct
    method Publish (line 184) | func (s *dialoutTelemetryServer) Publish(stream nokiasros.DialoutTelem...

FILE: pkg/cmd/path/path.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/processor/processor.go
  function New (line 9) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/prompt.go
  function getColor (line 57) | func getColor(flagName string) goprompt.Color {
  function newPromptCmd (line 86) | func newPromptCmd() *cobra.Command {
  function renderTable (line 242) | func renderTable(tabData [][]string, header []string) {
  function targetTable (line 252) | func targetTable(targetConfigs map[string]*types.TargetConfig, list bool...
  function subscriptionTable (line 300) | func subscriptionTable(scs map[string]*types.SubscriptionConfig, list bo...
  function findMatchedXPATH (line 343) | func findMatchedXPATH(entry *yang.Entry, input string, prefixPresent boo...
  function getDescriptionPrefix (line 420) | func getDescriptionPrefix(entry *yang.Entry) string {
  function getEntryType (line 433) | func getEntryType(entry *yang.Entry) string {
  function buildXPATHDescription (line 440) | func buildXPATHDescription(entry *yang.Entry) string {
  function getPermissions (line 462) | func getPermissions(entry *yang.Entry) string {
  function findMatchedSchema (line 477) | func findMatchedSchema(entry *yang.Entry, input string) []*yang.Entry {
  function findDynamicSuggestions (line 545) | func findDynamicSuggestions(annotation string, doc goprompt.Document) []...
  function subscriptionDescription (line 689) | func subscriptionDescription(sub *types.SubscriptionConfig) string {
  function showCommandArguments (line 719) | func showCommandArguments(b *goprompt.Buffer) {
  function ExecutePrompt (line 781) | func ExecutePrompt() {
  function initPromptCmds (line 856) | func initPromptCmds() {
  type cmdPrompt (line 877) | type cmdPrompt struct
    method Run (line 888) | func (co cmdPrompt) Run() {
  function parsePromptArgs (line 912) | func parsePromptArgs(in string) ([]string, error) {
  function findSuggestions (line 960) | func findSuggestions(co cmdPrompt, doc goprompt.Document) []goprompt.Sug...

FILE: pkg/cmd/prompt_test.go
  type testItem (line 17) | type testItem struct
  function TestGetInstancesTagsMatches (line 53) | func TestGetInstancesTagsMatches(t *testing.T) {

FILE: pkg/cmd/proxy/proxy.go
  function New (line 9) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/root.go
  function newRootCmd (line 55) | func newRootCmd() *cobra.Command {
  function Execute (line 91) | func Execute() {
  function init (line 102) | func init() {
  function initConfig (line 107) | func initConfig() {
  function setupCloseHandler (line 117) | func setupCloseHandler(cancelFn context.CancelFunc) {

FILE: pkg/cmd/set/set.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/subscribe/subscribe.go
  function New (line 34) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/tree/tree.go
  function New (line 9) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/version/version.go
  function New (line 17) | func New(gApp *app.App) *cobra.Command {

FILE: pkg/cmd/version/versionUpgrade.go
  function newVersionUpgradeCmd (line 20) | func newVersionUpgradeCmd(gApp *app.App) *cobra.Command {
  function initVersionUpgradeFlags (line 34) | func initVersionUpgradeFlags(cmd *cobra.Command, gApp *app.App) {

FILE: pkg/collector/api/const/const.go
  constant APIv1 (line 4) | APIv1                 = "/api/v1"
  constant ConfigAPIv1URL (line 5) | ConfigAPIv1URL        = APIv1 + "/config"
  constant TargetsConfigAPIv1URL (line 6) | TargetsConfigAPIv1URL = ConfigAPIv1URL + "/targets"
  constant TargetsAPIv1URL (line 8) | TargetsAPIv1URL       = APIv1 + "/targets"
  constant SubscriptionsAPIv1URL (line 9) | SubscriptionsAPIv1URL = APIv1 + "/subscriptions"
  constant OutputsAPIv1URL (line 10) | OutputsAPIv1URL       = APIv1 + "/outputs"
  constant InputsAPIv1URL (line 11) | InputsAPIv1URL        = APIv1 + "/inputs"
  constant AssignmentsAPIv1URL (line 13) | AssignmentsAPIv1URL = APIv1 + "/assignments"
  constant ProcessorsAPIv1URL (line 14) | ProcessorsAPIv1URL  = APIv1 + "/processors"

FILE: pkg/collector/api/server/apiserver.go
  type Server (line 26) | type Server struct
    method Start (line 65) | func (s *Server) Start(locker lockers.Locker, wg *sync.WaitGroup) error {
    method Stop (line 121) | func (s *Server) Stop() {
  function NewServer (line 42) | func NewServer(
  type APIErrors (line 129) | type APIErrors struct
  function createListener (line 133) | func createListener(apiCfg *config.APIServer) (net.Listener, error) {

FILE: pkg/collector/api/server/apply.go
  type ConfigApplyRequest (line 17) | type ConfigApplyRequest struct
  function validateApplyRequest (line 26) | func validateApplyRequest(req *ConfigApplyRequest) error {
  method handleConfigApply (line 47) | func (s *Server) handleConfigApply(w http.ResponseWriter, r *http.Reques...
  function decodeRequest (line 243) | func decodeRequest(reader io.Reader) (*ConfigApplyRequest, error) {
  function decodeRequestMap (line 257) | func decodeRequestMap(reqMap map[string]any) (*ConfigApplyRequest, error) {

FILE: pkg/collector/api/server/assignment.go
  type assignmentConfig (line 13) | type assignmentConfig struct
    method validate (line 18) | func (a *assignmentConfig) validate() error {
  type assignement (line 42) | type assignement struct
  method handleAssignmentPost (line 59) | func (s *Server) handleAssignmentPost(w http.ResponseWriter, r *http.Req...
  method handleAssignmentDelete (line 112) | func (s *Server) handleAssignmentDelete(w http.ResponseWriter, r *http.R...
  type assignmentResponse (line 129) | type assignmentResponse struct
  method handleAssignmentGet (line 134) | func (s *Server) handleAssignmentGet(w http.ResponseWriter, r *http.Requ...

FILE: pkg/collector/api/server/cluster.go
  type clusteringResponse (line 17) | type clusteringResponse struct
  type clusterMember (line 24) | type clusterMember struct
  method requireClustering (line 32) | func (s *Server) requireClustering(next http.Handler) http.Handler {
  method handleClusteringGet (line 43) | func (s *Server) handleClusteringGet(w http.ResponseWriter, r *http.Requ...
  method handleClusterRebalance (line 110) | func (s *Server) handleClusterRebalance(w http.ResponseWriter, r *http.R...
  method handleClusteringLeaderGet (line 132) | func (s *Server) handleClusteringLeaderGet(w http.ResponseWriter, r *htt...
  method handleClusteringLeaderDelete (line 198) | func (s *Server) handleClusteringLeaderDelete(w http.ResponseWriter, r *...
  method handleClusteringMembersGet (line 218) | func (s *Server) handleClusteringMembersGet(w http.ResponseWriter, r *ht...
  method handleClusteringDrainInstance (line 281) | func (s *Server) handleClusteringDrainInstance(w http.ResponseWriter, r ...
  type moveRequest (line 309) | type moveRequest struct
  method handleClusterMove (line 314) | func (s *Server) handleClusterMove(w http.ResponseWriter, r *http.Reques...
  method handleConfig (line 352) | func (s *Server) handleConfig(w http.ResponseWriter, r *http.Request) {
  function sanitizeConfig (line 372) | func sanitizeConfig(res map[string]any) map[string]any {
  method handleHealthzGet (line 397) | func (s *Server) handleHealthzGet(w http.ResponseWriter, r *http.Request) {
  method handleAdminShutdown (line 412) | func (s *Server) handleAdminShutdown(w http.ResponseWriter, r *http.Requ...

FILE: pkg/collector/api/server/inputs.go
  method handleConfigInputsGet (line 14) | func (s *Server) handleConfigInputsGet(w http.ResponseWriter, r *http.Re...
  method handleConfigInputsPost (line 51) | func (s *Server) handleConfigInputsPost(w http.ResponseWriter, r *http.R...
  method handleConfigInputsProcessorsPatch (line 151) | func (s *Server) handleConfigInputsProcessorsPatch(w http.ResponseWriter...
  method handleConfigInputsOutputsPatch (line 156) | func (s *Server) handleConfigInputsOutputsPatch(w http.ResponseWriter, r...
  method handleConfigInputsDelete (line 161) | func (s *Server) handleConfigInputsDelete(w http.ResponseWriter, r *http...

FILE: pkg/collector/api/server/metrics.go
  method registerMetrics (line 5) | func (s *Server) registerMetrics() {

FILE: pkg/collector/api/server/outputs.go
  method handleConfigOutputsGet (line 16) | func (s *Server) handleConfigOutputsGet(w http.ResponseWriter, r *http.R...
  method handleConfigOutputsPost (line 65) | func (s *Server) handleConfigOutputsPost(w http.ResponseWriter, r *http....
  method handleConfigOutputsProcessorsPatch (line 135) | func (s *Server) handleConfigOutputsProcessorsPatch(w http.ResponseWrite...
  method handleConfigOutputsDelete (line 140) | func (s *Server) handleConfigOutputsDelete(w http.ResponseWriter, r *htt...

FILE: pkg/collector/api/server/processors.go
  type ProcessorConfigResponse (line 12) | type ProcessorConfigResponse struct
  type ProcessorConfigRequest (line 18) | type ProcessorConfigRequest struct
  method handleConfigProcessorsGet (line 24) | func (s *Server) handleConfigProcessorsGet(w http.ResponseWriter, r *htt...
  method handleConfigProcessorsPost (line 101) | func (s *Server) handleConfigProcessorsPost(w http.ResponseWriter, r *ht...
  method handleConfigProcessorsDelete (line 143) | func (s *Server) handleConfigProcessorsDelete(w http.ResponseWriter, r *...

FILE: pkg/collector/api/server/routes.go
  method routes (line 10) | func (s *Server) routes() {
  method healthRoutes (line 27) | func (s *Server) healthRoutes(r *mux.Router) {
  method adminRoutes (line 31) | func (s *Server) adminRoutes(r *mux.Router) {
  method clusterRoutes (line 35) | func (s *Server) clusterRoutes(r *mux.Router) {
  method configRoutes (line 47) | func (s *Server) configRoutes(r *mux.Router) {
  method targetRoutes (line 87) | func (s *Server) targetRoutes(r *mux.Router) {
  method subscriptionRoutes (line 93) | func (s *Server) subscriptionRoutes(r *mux.Router) {
  method outputsRoutes (line 98) | func (s *Server) outputsRoutes(r *mux.Router) {
  method inputsRoutes (line 106) | func (s *Server) inputsRoutes(r *mux.Router) {
  method processorsRoutes (line 113) | func (s *Server) processorsRoutes(r *mux.Router) {
  method assignmentRoutes (line 120) | func (s *Server) assignmentRoutes(r *mux.Router) {
  method sseRoutes (line 127) | func (s *Server) sseRoutes(r *mux.Router) {

FILE: pkg/collector/api/server/sse.go
  type sseEvent (line 26) | type sseEvent struct
  method handleSSE (line 47) | func (s *Server) handleSSE(w http.ResponseWriter, r *http.Request) {
  method sendSSEEvent (line 138) | func (s *Server) sendSSEEvent(w http.ResponseWriter, flusher http.Flushe...

FILE: pkg/collector/api/server/subscriptions.go
  method handleConfigSubscriptionsGet (line 15) | func (s *Server) handleConfigSubscriptionsGet(w http.ResponseWriter, r *...
  method handleConfigSubscriptionsPost (line 73) | func (s *Server) handleConfigSubscriptionsPost(w http.ResponseWriter, r ...
  method handleConfigSubscriptionsDelete (line 116) | func (s *Server) handleConfigSubscriptionsDelete(w http.ResponseWriter, ...
  type SubscriptionResponse (line 134) | type SubscriptionResponse struct
  type TargetStateInfo (line 141) | type TargetStateInfo struct
  method handleSubscriptionsGet (line 147) | func (s *Server) handleSubscriptionsGet(w http.ResponseWriter, r *http.R...

FILE: pkg/collector/api/server/targets.go
  method handleConfigTargetsGet (line 18) | func (s *Server) handleConfigTargetsGet(w http.ResponseWriter, r *http.R...
  method handleConfigTargetsPost (line 68) | func (s *Server) handleConfigTargetsPost(w http.ResponseWriter, r *http....
  method handleConfigTargetsSubscriptionsPatch (line 161) | func (s *Server) handleConfigTargetsSubscriptionsPatch(w http.ResponseWr...
  method handleConfigTargetsOutputsPatch (line 228) | func (s *Server) handleConfigTargetsOutputsPatch(w http.ResponseWriter, ...
  method handleConfigTargetsDelete (line 283) | func (s *Server) handleConfigTargetsDelete(w http.ResponseWriter, r *htt...
  type TargetResponse (line 295) | type TargetResponse struct
  method handleTargetsGet (line 301) | func (s *Server) handleTargetsGet(w http.ResponseWriter, r *http.Request) {
  function targetResponseFromState (line 335) | func targetResponseFromState(name string, cfg *types.TargetConfig, ts *c...
  method handleTargetsStatePost (line 344) | func (s *Server) handleTargetsStatePost(w http.ResponseWriter, r *http.R...

FILE: pkg/collector/api/server/tunnel_target_match.go
  constant tunnelTargetMatchesPath (line 14) | tunnelTargetMatchesPath = "tunnel-target-matches"
  method handleConfigTunnelTargetMatchesGet (line 17) | func (s *Server) handleConfigTunnelTargetMatchesGet(w http.ResponseWrite...
  method handleConfigTunnelTargetMatchesPost (line 54) | func (s *Server) handleConfigTunnelTargetMatchesPost(w http.ResponseWrit...
  method handleConfigTunnelTargetMatchesDelete (line 78) | func (s *Server) handleConfigTunnelTargetMatchesDelete(w http.ResponseWr...

FILE: pkg/collector/collector.go
  constant defaultPipelineBufferSize (line 39) | defaultPipelineBufferSize = 1_000_000
  constant initLockerRetryTimer (line 40) | initLockerRetryTimer      = 1 * time.Second
  type Collector (line 43) | type Collector struct
    method Start (line 93) | func (c *Collector) Start() error {
    method Stop (line 141) | func (c *Collector) Stop() {
    method getLocker (line 150) | func (c *Collector) getLocker() error {
    method CollectorPreRunE (line 181) | func (c *Collector) CollectorPreRunE(cmd *cobra.Command, args []string...
    method CollectorRunE (line 214) | func (c *Collector) CollectorRunE(cmd *cobra.Command, _ []string) error {
    method InitCollectorFlags (line 222) | func (c *Collector) InitCollectorFlags(cmd *cobra.Command) {
    method initCache (line 228) | func (c *Collector) initCache() error {
  function New (line 63) | func New(ctx context.Context, configStore store.Store[any]) *Collector {

FILE: pkg/collector/env/env.go
  function ExpandClusterEnv (line 11) | func ExpandClusterEnv(clusteringConfig *config.Clustering) {
  function ExpandAPIEnv (line 28) | func ExpandAPIEnv(apiConfig *config.APIServer) {
  function expandLockerEnv (line 42) | func expandLockerEnv(locker map[string]any) {
  function expandMapEnv (line 46) | func expandMapEnv(m map[string]any) {
  function expandSliceEnv (line 70) | func expandSliceEnv(s []any) {

FILE: pkg/collector/env/env_test.go
  function TestExpandClusterEnv (line 12) | func TestExpandClusterEnv(t *testing.T) {
  function TestExpandAPIEnv (line 183) | func TestExpandAPIEnv(t *testing.T) {

FILE: pkg/collector/managers/cluster/assigner.go
  type Assignment (line 17) | type Assignment struct
  type assignmentConfig (line 22) | type assignmentConfig struct
  type Assigner (line 27) | type Assigner interface
  constant httpScheme (line 33) | httpScheme    = "http"
  constant httpsScheme (line 34) | httpsScheme   = "https"
  constant protocolLabel (line 35) | protocolLabel = "__protocol"
  type restAssigner (line 38) | type restAssigner struct
    method Assign (line 54) | func (p *restAssigner) Assign(ctx context.Context, targetToMember map[...
    method assignOne (line 78) | func (p *restAssigner) assignOne(ctx context.Context, address string, ...
    method Unassign (line 101) | func (p *restAssigner) Unassign(ctx context.Context, member *Member, t...
  function NewAssigner (line 44) | func NewAssigner(store *collstore.Store) Assigner {

FILE: pkg/collector/managers/cluster/cluster_manager.go
  constant protocolTagName (line 30) | protocolTagName          = "__protocol"
  constant retryRegistrationBackoff (line 31) | retryRegistrationBackoff = 2 * time.Second
  type ClusterManager (line 34) | type ClusterManager struct
    method Start (line 73) | func (c *ClusterManager) Start(ctx context.Context, locker lockers.Loc...
    method Stop (line 159) | func (c *ClusterManager) Stop() error {
    method runCampaign (line 166) | func (c *ClusterManager) runCampaign(ctx context.Context) error {
    method startRegistration (line 232) | func (c *ClusterManager) startRegistration(ctx context.Context) error {
    method runLeader (line 268) | func (c *ClusterManager) runLeader(ctx context.Context) error {
    method WithdrawLeader (line 357) | func (c *ClusterManager) WithdrawLeader(ctx context.Context, cooldown ...
    method IsLeader (line 362) | func (c *ClusterManager) IsLeader(ctx context.Context) (bool, error) {
    method snapshotMembers (line 370) | func (c *ClusterManager) snapshotMembers() map[string]*Member {
    method reconcileAssignments (line 378) | func (c *ClusterManager) reconcileAssignments(ctx context.Context, mem...
    method handleTargetCreate (line 443) | func (c *ClusterManager) handleTargetCreate(ctx context.Context, targe...
    method assignTarget (line 459) | func (c *ClusterManager) assignTarget(ctx context.Context, target stri...
    method getAssignments (line 476) | func (c *ClusterManager) getAssignments(ctx context.Context) (map[stri...
    method getAssignment (line 499) | func (c *ClusterManager) getAssignment(ctx context.Context, target str...
    method GetMembers (line 510) | func (c *ClusterManager) GetMembers(ctx context.Context) (map[string]*...
    method populateMemberLoad (line 519) | func (c *ClusterManager) populateMemberLoad(ctx context.Context, membe...
    method getMembersLoad (line 559) | func (c *ClusterManager) getMembersLoad(ctx context.Context) (map[stri...
    method getLeastLoadedMember (line 576) | func (c *ClusterManager) getLeastLoadedMember(assignments map[string]*...
    method getMostLoadedMember (line 590) | func (c *ClusterManager) getMostLoadedMember(members map[string]*Membe...
    method handleTargetDelete (line 603) | func (c *ClusterManager) handleTargetDelete(ctx context.Context, targe...
    method deleteTargetFromMembers (line 630) | func (c *ClusterManager) deleteTargetFromMembers(ctx context.Context, ...
    method targetLockHolder (line 653) | func (c *ClusterManager) targetLockHolder(ctx context.Context, target ...
    method GetInstanceToTargetsMapping (line 667) | func (c *ClusterManager) GetInstanceToTargetsMapping(ctx context.Conte...
    method GetLeaderName (line 685) | func (c *ClusterManager) GetLeaderName(ctx context.Context) (string, e...
    method DrainMember (line 697) | func (c *ClusterManager) DrainMember(ctx context.Context, toBeDrained ...
    method asyncVerifyLock (line 731) | func (c *ClusterManager) asyncVerifyLock(ctx context.Context, target, ...
  function NewClusterManager (line 61) | func NewClusterManager(store *collstore.Store) *ClusterManager {

FILE: pkg/collector/managers/cluster/election.go
  constant recampaignBackoff (line 18) | recampaignBackoff     = 200 * time.Millisecond
  constant recampaignJitterRatio (line 19) | recampaignJitterRatio = 0.2
  type Election (line 22) | type Election interface
  type election (line 32) | type election struct
    method Campaign (line 82) | func (e *election) Campaign(ctx context.Context) (term int64, err erro...
    method Observe (line 149) | func (e *election) Observe(ctx context.Context) <-chan struct{} {
    method Withdraw (line 156) | func (e *election) Withdraw() error {
    method leaderKey (line 187) | func (e *election) leaderKey() string {
    method keepalive (line 193) | func (e *election) keepalive(ctx context.Context, key string) {
    method signalLoss (line 218) | func (e *election) signalLoss() {
  function NewElection (line 51) | func NewElection(locker lockers.Locker, clustering *config.Clustering, l...
  function tryAcquire (line 243) | func tryAcquire(ctx context.Context, lk lockers.Locker, key string, hold...
  function renew (line 292) | func renew(ctx context.Context, lk lockers.Locker, key string, holder []...
  function holder (line 306) | func holder(ctx context.Context, lk lockers.Locker, key string) (string,...

FILE: pkg/collector/managers/cluster/membership.go
  constant apiServiceName (line 15) | apiServiceName = "gnmic-api"
  type Membership (line 18) | type Membership interface
  type Registration (line 24) | type Registration struct
  type Member (line 32) | type Member struct
    method String (line 40) | func (m *Member) String() string {
  type membership (line 45) | type membership struct
    method GetMembers (line 56) | func (m *membership) GetMembers(ctx context.Context) (map[string]*Memb...
    method Watch (line 72) | func (m *membership) Watch(ctx context.Context) (<-chan map[string]*Me...
    method Register (line 109) | func (m *membership) Register(ctx context.Context, clusterName string,...
    method serviceName (line 125) | func (m *membership) serviceName() string {
  function NewMembership (line 52) | func NewMembership(locker lockers.Locker, config *config.Clustering, log...

FILE: pkg/collector/managers/cluster/placement.go
  function pickAssignee (line 10) | func pickAssignee(
  function tieBreak (line 34) | func tieBreak(targetName, memberA, memberB string) bool {
  function fnv64 (line 48) | func fnv64(s string) uint64 {

FILE: pkg/collector/managers/cluster/rebalance.go
  method RebalanceTargets (line 11) | func (c *ClusterManager) RebalanceTargets(ctx context.Context) error {
  method RebalanceTargetsV2 (line 80) | func (c *ClusterManager) RebalanceTargetsV2() error {
  function rebalance (line 144) | func rebalance(members map[string]*Member) map[string]*Member {
  function calculateMembersQuota (line 249) | func calculateMembersQuota(members map[string]*Member, total int64) map[...
  type donor (line 280) | type donor struct
  type receiver (line 289) | type receiver struct

FILE: pkg/collector/managers/cluster/utils.go
  function targetsLockPrefix (line 10) | func targetsLockPrefix(clusterName string) string {
  function targetLockKey (line 14) | func targetLockKey(target, clusterName string) string {
  function GetAPIScheme (line 18) | func GetAPIScheme(member *Member) string {
  function getMemberAddress (line 35) | func getMemberAddress(member *Member) string {
  function jittered (line 39) | func jittered(d time.Duration) time.Duration {

FILE: pkg/collector/managers/inputs/inputs_manager.go
  type ManagedInput (line 19) | type ManagedInput struct
    method updateProcessor (line 258) | func (mi *ManagedInput) updateProcessor(name string, cfg map[string]an...
  type InputsManager (line 26) | type InputsManager struct
    method Start (line 49) | func (mgr *InputsManager) Start(wg *sync.WaitGroup) error {
    method Stop (line 111) | func (mgr *InputsManager) Stop() {
    method createInput (line 123) | func (mgr *InputsManager) createInput(name string, cfg map[string]any) {
    method updateInput (line 148) | func (mgr *InputsManager) updateInput(name string, cfg map[string]any) {
    method DeleteInput (line 174) | func (mgr *InputsManager) DeleteInput(name string) error {
    method trackProcessorsInUse (line 217) | func (mgr *InputsManager) trackProcessorsInUse(in string, procs []stri...
    method untrackProcessorsInUse (line 226) | func (mgr *InputsManager) untrackProcessorsInUse(in string, procs []st...
    method ProcessorInUse (line 237) | func (mgr *InputsManager) ProcessorInUse(name string) bool {
    method updateProcessor (line 247) | func (mgr *InputsManager) updateProcessor(name string, cfg map[string]...
    method setInputState (line 266) | func (mgr *InputsManager) setInputState(name, state, failedReason stri...
    method GetInputState (line 280) | func (mgr *InputsManager) GetInputState(name string) *collstore.InputS...
    method ListInputStates (line 293) | func (mgr *InputsManager) ListInputStates() []*collstore.InputState {
  function NewInputsManager (line 38) | func NewInputsManager(ctx context.Context, store *collstore.Store, pipel...
  function extractProcessors (line 196) | func extractProcessors(cfg map[string]any) []string {

FILE: pkg/collector/managers/outputs/outputs_manager.go
  type ManagedOutput (line 24) | type ManagedOutput struct
    method updateProcessor (line 192) | func (mo *ManagedOutput) updateProcessor(name string, cfg map[string]a...
  type OutputsManager (line 32) | type OutputsManager struct
    method Start (line 67) | func (mgr *OutputsManager) Start(cache cache.Cache, wg *sync.WaitGroup...
    method writeLoop (line 139) | func (mgr *OutputsManager) writeLoop(wg *sync.WaitGroup) {
    method write (line 159) | func (mgr *OutputsManager) write(e *pipeline.Msg) {
    method updateProcessor (line 181) | func (mgr *OutputsManager) updateProcessor(name string, cfg map[string...
    method getOutputsForTarget (line 198) | func (mgr *OutputsManager) getOutputsForTarget(outputs map[string]stru...
    method createOutput (line 222) | func (mgr *OutputsManager) createOutput(name string, cfg map[string]an...
    method updateOutput (line 266) | func (mgr *OutputsManager) updateOutput(name string, cfg map[string]an...
    method StopOutput (line 293) | func (mgr *OutputsManager) StopOutput(name string) error {
    method DeleteOutput (line 313) | func (mgr *OutputsManager) DeleteOutput(name string) error {
    method Stop (line 335) | func (mgr *OutputsManager) Stop() {
    method registerMetrics (line 364) | func (mgr *OutputsManager) registerMetrics() {
    method WriteToCache (line 372) | func (mgr *OutputsManager) WriteToCache(ctx context.Context, msg *pipe...
    method trackProcessorsInUse (line 425) | func (mgr *OutputsManager) trackProcessorsInUse(out string, procs []st...
    method untrackProcessorsInUse (line 434) | func (mgr *OutputsManager) untrackProcessorsInUse(out string, procs []...
    method ProcessorInUse (line 445) | func (mgr *OutputsManager) ProcessorInUse(name string) bool {
    method setOutputState (line 457) | func (mgr *OutputsManager) setOutputState(name, state, failedReason st...
    method getOutputStateStr (line 470) | func (mgr *OutputsManager) getOutputStateStr(name string) string {
    method GetOutputState (line 479) | func (mgr *OutputsManager) GetOutputState(name string) *collstore.Outp...
    method ListOutputStates (line 492) | func (mgr *OutputsManager) ListOutputStates() []*collstore.OutputState {
  type outputStats (line 49) | type outputStats struct
  function NewOutputsManager (line 54) | func NewOutputsManager(ctx context.Context, store *collstore.Store, pipe...
  function newOutputStats (line 347) | func newOutputStats() *outputStats {
  function addTargetToMsg (line 390) | func addTargetToMsg(msg proto.Message, targetName string) proto.Message {
  function extractProcessors (line 404) | func extractProcessors(cfg map[string]any) []string {

FILE: pkg/collector/managers/targets/cluster.go
  method isClustering (line 10) | func (tm *TargetsManager) isClustering() (*config.Clustering, bool, erro...
  method amIAssigned (line 25) | func (tm *TargetsManager) amIAssigned(name string) bool {
  method setAssigned (line 35) | func (tm *TargetsManager) setAssigned(name string, v bool) {
  method targetLockKey (line 69) | func (tm *TargetsManager) targetLockKey(target string) string {

FILE: pkg/collector/managers/targets/loader.go
  method initLoader (line 10) | func (tm *TargetsManager) initLoader(cfg map[string]any) (loaders.Target...
  method startLoader (line 28) | func (tm *TargetsManager) startLoader(ctx context.Context, loader loader...

FILE: pkg/collector/managers/targets/metrics.go
  constant targetMetricsUpdatePeriod (line 10) | targetMetricsUpdatePeriod = 10 * time.Second
  type targetConnectionState (line 13) | type targetConnectionState
    method String (line 51) | func (tcs targetConnectionState) String() string {
  constant targetConnectionStateUnknown (line 16) | targetConnectionStateUnknown targetConnectionState = iota
  constant targetConnectionStateIdle (line 17) | targetConnectionStateIdle
  constant targetConnectionStateConnecting (line 18) | targetConnectionStateConnecting
  constant targetConnectionStateReady (line 19) | targetConnectionStateReady
  constant targetConnectionStateTransientFailure (line 20) | targetConnectionStateTransientFailure
  constant targetConnectionStateShutdown (line 21) | targetConnectionStateShutdown
  constant targetConnectionStateUnknownStr (line 25) | targetConnectionStateUnknownStr          = "UNKNOWN"
  constant targetConnectionStateIdleStr (line 26) | targetConnectionStateIdleStr             = "IDLE"
  constant targetConnectionStateConnectingStr (line 27) | targetConnectionStateConnectingStr       = "CONNECTING"
  constant targetConnectionStateReadyStr (line 28) | targetConnectionStateReadyStr            = "READY"
  constant targetConnectionStateTransientFailureStr (line 29) | targetConnectionStateTransientFailureStr = "TRANSIENT_FAILURE"
  constant targetConnectionStateShutdownStr (line 30) | targetConnectionStateShutdownStr         = "SHUTDOWN"
  function targetConnectionStateFromStr (line 33) | func targetConnectionStateFromStr(str string) targetConnectionState {
  type targetsStats (line 69) | type targetsStats struct
  constant subscriptionRequestErrorTypeUnknown (line 78) | subscriptionRequestErrorTypeUnknown string = "UNKNOWN"
  constant subscriptionRequestErrorTypeCONFIG (line 79) | subscriptionRequestErrorTypeCONFIG  string = "CONFIG_ERROR"
  constant subscriptionRequestErrorTypeGRPC (line 80) | subscriptionRequestErrorTypeGRPC    string = "GRPC_ERROR"
  function newTargetsStats (line 83) | func newTargetsStats() *targetsStats {
  method registerMetrics (line 118) | func (tm *TargetsManager) registerMetrics() {
  method updateTargetMetrics (line 149) | func (tm *TargetsManager) updateTargetMetrics(mt *ManagedTarget) {

FILE: pkg/collector/managers/targets/targets_manager.go
  type ManagedTarget (line 36) | type ManagedTarget struct
    method setLastError (line 55) | func (mt *ManagedTarget) setLastError(msg string) {
    method getLastError (line 61) | func (mt *ManagedTarget) getLastError() string {
    method clearLastError (line 67) | func (mt *ManagedTarget) clearLastError() {
  function newManagedTarget (line 73) | func newManagedTarget(name string, cfg *types.TargetConfig, tunServer *t...
  type TargetsManager (line 92) | type TargetsManager struct
    method Start (line 135) | func (tm *TargetsManager) Start(locker lockers.Locker, wg *sync.WaitGr...
    method Stop (line 305) | func (tm *TargetsManager) Stop() {
    method apply (line 312) | func (tm *TargetsManager) apply(name string, cfg *types.TargetConfig) {
    method start (line 443) | func (tm *TargetsManager) start(mt *ManagedTarget) error {
    method targetGRPCOpts (line 561) | func (tm *TargetsManager) targetGRPCOpts(ctx context.Context, mt *Mana...
    method tunDialerFn (line 568) | func (tm *TargetsManager) tunDialerFn(ctx context.Context, mt *Managed...
    method stop (line 582) | func (tm *TargetsManager) stop(mt *ManagedTarget) error {
    method remove (line 618) | func (tm *TargetsManager) remove(name string) {
    method applySubscription (line 636) | func (tm *TargetsManager) applySubscription(name string, cfg types.Sub...
    method removeSubscription (line 675) | func (tm *TargetsManager) removeSubscription(name string) {
    method reconcileAssignment (line 692) | func (tm *TargetsManager) reconcileAssignment(name string) {
    method getConfig (line 745) | func (tm *TargetsManager) getConfig(name string) (*types.TargetConfig,...
    method Lookup (line 754) | func (tm *TargetsManager) Lookup(name string) *ManagedTarget {
    method ForEach (line 760) | func (tm *TargetsManager) ForEach(fn func(*ManagedTarget)) {
    method SetIntendedState (line 768) | func (tm *TargetsManager) SetIntendedState(name string, state string) ...
    method GetIntendedState (line 794) | func (tm *TargetsManager) GetIntendedState(name string) string {
    method startTargetSubscription (line 802) | func (tm *TargetsManager) startTargetSubscription(mt *ManagedTarget, c...
    method compareSubscriptions (line 925) | func (tm *TargetsManager) compareSubscriptions(old, new []string) (add...
    method compareOutputs (line 964) | func (tm *TargetsManager) compareOutputs(old, new *types.TargetConfig)...
    method watchConnState (line 1096) | func (tm *TargetsManager) watchConnState(ctx context.Context, mt *Mana...
    method setTargetState (line 1129) | func (tm *TargetsManager) setTargetState(name, state string) {
    method getTargetStateStr (line 1166) | func (tm *TargetsManager) getTargetStateStr(name string) string {
    method GetTargetState (line 1175) | func (tm *TargetsManager) GetTargetState(name string) *collstore.Targe...
    method ListTargetStates (line 1188) | func (tm *TargetsManager) ListTargetStates() []*collstore.TargetState {
  function NewTargetsManager (line 115) | func NewTargetsManager(ctx context.Context, store *collstore.Store, pipe...
  function shouldReconnect (line 911) | func shouldReconnect(old, new *types.TargetConfig) bool {
  function keys (line 1005) | func keys[T any](m map[string]T) []string {
  type connSpec (line 1014) | type connSpec struct
  function hashConnSpec (line 1043) | func hashConnSpec(cfg *types.TargetConfig) (uint64, error) {
  function connSpecFrom (line 1054) | func connSpecFrom(tc *types.TargetConfig) connSpec {
  function val (line 1085) | func val[T any](p *T) T {

FILE: pkg/collector/managers/targets/tunnel_server.go
  type tunnelServerConfig (line 29) | type tunnelServerConfig struct
  type tunnelServer (line 38) | type tunnelServer struct
    method gRPCTunnelServerOpts (line 64) | func (ts *tunnelServer) gRPCTunnelServerOpts() ([]grpc.ServerOption, e...
    method startTunnelServer (line 100) | func (ts *tunnelServer) startTunnelServer(ctx context.Context) error {
    method addTargetHandler (line 195) | func (ts *tunnelServer) addTargetHandler(tt tunnel.Target) error {
    method deleteTargetHandler (line 217) | func (ts *tunnelServer) deleteTargetHandler(tt tunnel.Target) error {
    method registerHandler (line 232) | func (ts *tunnelServer) registerHandler(ss tunnel.ServerSession) error {
    method serverHandler (line 236) | func (ts *tunnelServer) serverHandler(ss tunnel.ServerSession, rwc io....
    method getTunnelTargetMatch (line 240) | func (ts *tunnelServer) getTunnelTargetMatch(tt tunnel.Target) *types....
    method watchTunnelTargetMatches (line 305) | func (ts *tunnelServer) watchTunnelTargetMatches(ctx context.Context, ...
    method reconcileConnectedTargets (line 338) | func (ts *tunnelServer) reconcileConnectedTargets() {
  function newTunnelServer (line 53) | func newTunnelServer(s store.Store[any], reg *prometheus.Registry) *tunn...

FILE: pkg/collector/store/store.go
  type Store (line 19) | type Store struct
  function NewStore (line 26) | func NewStore(configStore zstore.Store[any]) *Store {

FILE: pkg/collector/store/types.go
  constant IntendedStateEnabled (line 15) | IntendedStateEnabled  = "enabled"
  constant IntendedStateDisabled (line 16) | IntendedStateDisabled = "disabled"
  constant StateRunning (line 18) | StateRunning  = "running"
  constant StateStopped (line 19) | StateStopped  = "stopped"
  constant StateStarting (line 20) | StateStarting = "starting"
  constant StateFailed (line 21) | StateFailed   = "failed"
  constant StatePaused (line 22) | StatePaused   = "paused"
  constant StateStopping (line 23) | StateStopping = "stopping"
  constant KindTargets (line 28) | KindTargets             = "targets"
  constant KindOutputs (line 29) | KindOutputs             = "outputs"
  constant KindInputs (line 30) | KindInputs              = "inputs"
  constant KindSubscriptions (line 31) | KindSubscriptions       = "subscriptions"
  constant KindProcessors (line 32) | KindProcessors          = "processors"
  constant KindAssignments (line 33) | KindAssignments         = "assignments"
  constant KindTunnelTargetMatches (line 34) | KindTunnelTargetMatches = "tunnel-target-matches"
  type ComponentState (line 38) | type ComponentState struct
  type TargetState (line 47) | type TargetState struct
  type OutputState (line 54) | type OutputState struct
  type InputState (line 59) | type InputState struct
  type SubscriptionState (line 64) | type SubscriptionState struct

FILE: pkg/config/actions.go
  method GetActions (line 17) | func (c *Config) GetActions() (map[string]map[string]interface{}, error) {
  method validateActionsConfig (line 55) | func (c *Config) validateActionsConfig(acfg map[string]interface{}) error {

FILE: pkg/config/api_server.go
  constant defaultAPIServerAddress (line 20) | defaultAPIServerAddress = ":7890"
  constant defaultAPIServerTimeout (line 21) | defaultAPIServerTimeout = 10 * time.Second
  constant trueString (line 22) | trueString              = "true"
  type APIServer (line 25) | type APIServer struct
  method GetAPIServer (line 35) | func (c *Config) GetAPIServer() error {
  method setAPIServerDefaults (line 64) | func (c *Config) setAPIServerDefaults() {

FILE: pkg/config/clustering.go
  constant minTargetWatchTimer (line 21) | minTargetWatchTimer            = 20 * time.Second
  constant defaultTargetAssignmentTimeout (line 22) | defaultTargetAssignmentTimeout = 10 * time.Second
  constant defaultServicesWatchTimer (line 23) | defaultServicesWatchTimer      = 1 * time.Minute
  constant defaultLeaderWaitTimer (line 24) | defaultLeaderWaitTimer         = 5 * time.Second
  type Clustering (line 27) | type Clustering struct
  method GetClustering (line 40) | func (c *Config) GetClustering() error {
  method setClusteringDefaults (line 70) | func (c *Config) setClusteringDefaults() {

FILE: pkg/config/config.go
  constant configName (line 43) | configName      = ".gnmic"
  constant configLogPrefix (line 44) | configLogPrefix = "[config] "
  constant envPrefix (line 45) | envPrefix       = "GNMIC"
  constant trimChars (line 46) | trimChars       = " \r\n\t"
  type Config (line 53) | type Config struct
    method Load (line 304) | func (c *Config) Load(ctx context.Context) error {
    method ToStore (line 347) | func (c *Config) ToStore(s store.Store[any]) error {
    method SetLogger (line 443) | func (c *Config) SetLogger() (io.Writer, int, error) {
    method SetPersistentFlagsFromFile (line 478) | func (c *Config) SetPersistentFlagsFromFile(cmd *cobra.Command) {
    method SetLocalFlagsFromFile (line 502) | func (c *Config) SetLocalFlagsFromFile(cmd *cobra.Command) {
    method setFlagValue (line 515) | func (c *Config) setFlagValue(cmd *cobra.Command, fName string, val in...
    method CreateGetRequest (line 550) | func (c *Config) CreateGetRequest(tc *types.TargetConfig) (*gnmi.GetRe...
    method CreateGASGetRequest (line 583) | func (c *Config) CreateGASGetRequest() (*gnmi.GetRequest, error) {
    method CreateGASSetRequest (line 595) | func (c *Config) CreateGASSetRequest(input interface{}) (*gnmi.SetRequ...
    method execPathTemplate (line 637) | func (c *Config) execPathTemplate(tplString string, input interface{})...
    method execValueTemplate (line 677) | func (c *Config) execValueTemplate(tplString string, input interface{}...
    method CreateSetRequest (line 717) | func (c *Config) CreateSetRequest(targetName string) ([]*gnmi.SetReque...
    method ValidateSetInput (line 1022) | func (c *Config) ValidateSetInput() error {
    method expandOSPathFlagValues (line 1124) | func (c *Config) expandOSPathFlagValues() error {
  type GlobalFlags (line 77) | type GlobalFlags struct
  type LocalFlags (line 132) | type LocalFlags struct
  function New (line 282) | func New() *Config {
  function flagIsSet (line 536) | func flagIsSet(cmd *cobra.Command, name string) bool {
  function readFile (line 958) | func readFile(name string) ([]byte, error) {
  function toJSONBytes (line 971) | func toJSONBytes(data []byte) ([]byte, error) {
  function SanitizeArrayFlagValue (line 994) | func SanitizeArrayFlagValue(ls []string) []string {
  function ParseAddressField (line 1008) | func ParseAddressField(addr []string) []string {
  function ExpandOSPaths (line 1085) | func ExpandOSPaths(paths []string) ([]string, error) {
  function expandOSPath (line 1096) | func expandOSPath(p string) (string, error) {
  function trimQuotes (line 1137) | func trimQuotes(s string) string {

FILE: pkg/config/config_test.go
  function TestCreateGetRequest (line 586) | func TestCreateGetRequest(t *testing.T) {
  function TestCreateSetRequest (line 607) | func TestCreateSetRequest(t *testing.T) {
  function TestExecPathTemplate (line 627) | func TestExecPathTemplate(t *testing.T) {

FILE: pkg/config/diff.go
  method CreateDiffSubscribeRequest (line 23) | func (c *Config) CreateDiffSubscribeRequest(cmd *cobra.Command) (*gnmi.S...
  method CreateDiffGetRequest (line 39) | func (c *Config) CreateDiffGetRequest() (*gnmi.GetRequest, error) {

FILE: pkg/config/environment.go
  function envToMap (line 19) | func envToMap() map[string]any {
  function mergeMap (line 36) | func mergeMap(m map[string]any, items []string, v any) {
  method mergeEnvVars (line 55) | func (c *Config) mergeEnvVars() {
  method SetGlobalsFromEnv (line 63) | func (c *Config) SetGlobalsFromEnv(cmd *cobra.Command) {
  function expandMapEnv (line 84) | func expandMapEnv(m map[string]interface{}, fn func(string, string) stri...
  function expandSliceEnv (line 108) | func expandSliceEnv(parent string, s []any, fn func(string, string) stri...
  function expandExcept (line 121) | func expandExcept(except ...string) func(string, string) string {
  function expandAll (line 132) | func expandAll() func(string, string) string {

FILE: pkg/config/gnmi_ext.go
  function createAdditionalRequestExtensions (line 16) | func createAdditionalRequestExtensions(
  method parseAdditionalRequestExtensions (line 91) | func (c *Config) parseAdditionalRequestExtensions() ([]api.GNMIOption, e...

FILE: pkg/config/gnmi_server.go
  constant defaultAddress (line 23) | defaultAddress           = ":57400"
  constant defaultMaxSubscriptions (line 24) | defaultMaxSubscriptions  = 64
  constant defaultMaxUnaryRPC (line 25) | defaultMaxUnaryRPC       = 64
  constant minimumSampleInterval (line 26) | minimumSampleInterval    = 1 * time.Millisecond
  constant defaultSampleInterval (line 27) | defaultSampleInterval    = 1 * time.Second
  constant minimumHeartbeatInterval (line 28) | minimumHeartbeatInterval = 1 * time.Second
  constant defaultServiceRegistrationAddress (line 30) | defaultServiceRegistrationAddress = "localhost:8500"
  constant defaultRegistrationCheckInterval (line 31) | defaultRegistrationCheckInterval  = 5 * time.Second
  constant defaultMaxServiceFail (line 32) | defaultMaxServiceFail             = 3
  type GNMIServer (line 35) | type GNMIServer struct
  type serviceRegistration (line 58) | type serviceRegistration struct
  type grpcKeepaliveConfig (line 73) | type grpcKeepaliveConfig struct
    method Convert (line 97) | func (gkc *grpcKeepaliveConfig) Convert() *keepalive.ServerParameters {
  method GetGNMIServer (line 110) | func (c *Config) GetGNMIServer() error {
  method setGnmiServerDefaults (line 183) | func (c *Config) setGnmiServerDefaults() {
  method setGnmiServerServiceRegistrationDefaults (line 204) | func (c *Config) setGnmiServerServiceRegistrationDefaults() {

FILE: pkg/config/inputs.go
  method GetInputs (line 18) | func (c *Config) GetInputs() (map[string]map[string]interface{}, error) {

FILE: pkg/config/loader.go
  method GetLoader (line 21) | func (c *Config) GetLoader() error {

FILE: pkg/config/locker.go
  method getLocker (line 18) | func (c *Config) getLocker() error {

FILE: pkg/config/outputs.go
  method GetOutputs (line 20) | func (c *Config) GetOutputs() (map[string]map[string]any, error) {
  function convert (line 84) | func convert(i interface{}) interface{} {
  type outputSuggestion (line 104) | type outputSuggestion struct
  method GetOutputsSuggestions (line 109) | func (c *Config) GetOutputsSuggestions() []outputSuggestion {
  method GetOutputsConfigs (line 134) | func (c *Config) GetOutputsConfigs() [][]string {

FILE: pkg/config/outputs_test.go
  function TestGetOutputs (line 73) | func TestGetOutputs(t *testing.T) {

FILE: pkg/config/plugins.go
  type PluginsConfig (line 7) | type PluginsConfig struct
  method GetPluginsConfig (line 14) | func (c *Config) GetPluginsConfig() (*PluginsConfig, error) {

FILE: pkg/config/processors.go
  method GetEventProcessors (line 17) | func (c *Config) GetEventProcessors() (map[string]map[string]interface{}...
  method validateProcessorConfig (line 57) | func (c *Config) validateProcessorConfig(pcfg map[string]interface{}) er...
  function strInlist (line 66) | func strInlist(s string, ls []string) bool {

FILE: pkg/config/processors_test.go
  function TestGetProcessors (line 105) | func TestGetProcessors(t *testing.T) {

FILE: pkg/config/set.go
  constant varFileSuffix (line 34) | varFileSuffix = "_vars"
  type UpdateItem (line 37) | type UpdateItem struct
  type SetRequestFile (line 43) | type SetRequestFile struct
  type commitAction (line 53) | type commitAction
  constant commitActionRequest (line 56) | commitActionRequest             commitAction = "request"
  constant commitActionCancel (line 57) | commitActionCancel              commitAction = "cancel"
  constant commitActionConfirm (line 58) | commitActionConfirm             commitAction = "confirm"
  constant commitActionSetRollbackDuration (line 59) | commitActionSetRollbackDuration commitAction = "set-rollback-duration"
  method ReadSetRequestTemplate (line 62) | func (c *Config) ReadSetRequestTemplate() error {
  method readTemplateVarsFile (line 84) | func (c *Config) readTemplateVarsFile() error {
  method CreateSetRequestFromFile (line 121) | func (c *Config) CreateSetRequestFromFile(targetName string) ([]*gnmi.Se...
  type templateInput (line 277) | type templateInput struct
  method CreateSetRequestFromProtoFile (line 282) | func (c *Config) CreateSetRequestFromProtoFile() ([]*gnmi.SetRequest, er...

FILE: pkg/config/set_test.go
  function TestCreateSetRequestFromFile (line 474) | func TestCreateSetRequestFromFile(t *testing.T) {

FILE: pkg/config/subscriptions.go
  constant SubscriptionMode_STREAM (line 27) | SubscriptionMode_STREAM               = "STREAM"
  constant SubscriptionMode_ONCE (line 28) | SubscriptionMode_ONCE                 = "ONCE"
  constant SubscriptionMode_POLL (line 29) | SubscriptionMode_POLL                 = "POLL"
  constant SubscriptionStreamMode_TARGET_DEFINED (line 30) | SubscriptionStreamMode_TARGET_DEFINED = "TARGET_DEFINED"
  constant SubscriptionStreamMode_ON_CHANGE (line 31) | SubscriptionStreamMode_ON_CHANGE      = "ON_CHANGE"
  constant SubscriptionStreamMode_SAMPLE (line 32) | SubscriptionStreamMode_SAMPLE         = "SAMPLE"
  constant subscriptionDefaultMode (line 35) | subscriptionDefaultMode       = SubscriptionMode_STREAM
  constant subscriptionDefaultStreamMode (line 36) | subscriptionDefaultStreamMode = SubscriptionStreamMode_TARGET_DEFINED
  constant subscriptionDefaultEncoding (line 37) | subscriptionDefaultEncoding   = "JSON"
  method GetSubscriptions (line 42) | func (c *Config) GetSubscriptions(cmd *cobra.Command) (map[string]*types...
  method subscriptionConfigFromFlags (line 102) | func (c *Config) subscriptionConfigFromFlags(cmd *cobra.Command) (map[st...
  method decodeSubscriptionConfig (line 159) | func (c *Config) decodeSubscriptionConfig(sn string, s any, cmd *cobra.C...
  method setSubscriptionFieldsFromFlags (line 182) | func (c *Config) setSubscriptionFieldsFromFlags(sub *types.SubscriptionC...
  method GetSubscriptionsFromFile (line 230) | func (c *Config) GetSubscriptionsFromFile() []*types.SubscriptionConfig {
  function validateSubscriptionsConfig (line 245) | func validateSubscriptionsConfig(subs map[string]*types.SubscriptionConf...
  function expandSubscriptionEnv (line 265) | func expandSubscriptionEnv(sc *types.SubscriptionConfig) {

FILE: pkg/config/subscriptions_test.go
  function mustParseTime (line 23) | func mustParseTime(tm string) time.Time {
  function TestGetSubscriptions (line 228) | func TestGetSubscriptions(t *testing.T) {

FILE: pkg/config/targets.go
  constant defaultTargetBufferSize (line 26) | defaultTargetBufferSize = 100
  method GetTargets (line 31) | func (c *Config) GetTargets() (map[string]*types.TargetConfig, error) {
  method SetTargetConfigDefaults (line 126) | func (c *Config) SetTargetConfigDefaults(tc *types.TargetConfig) error {
  function setTargetConfigDefaultsFromGlobalFlags (line 130) | func setTargetConfigDefaultsFromGlobalFlags(tc *types.TargetConfig, gfla...
  method SetTargetConfigDefaultsExpandEnv (line 219) | func (c *Config) SetTargetConfigDefaultsExpandEnv(tc *types.TargetConfig...
  method TargetsList (line 229) | func (c *Config) TargetsList() []*types.TargetConfig {
  function expandCertPaths (line 240) | func expandCertPaths(tc *types.TargetConfig) error {
  function expandTargetEnv (line 265) | func expandTargetEnv(tc *types.TargetConfig) {
  method GetDiffTargets (line 308) | func (c *Config) GetDiffTargets() (*types.TargetConfig, map[string]*type...
  function SetTargetConfigDefaults (line 347) | func SetTargetConfigDefaults(s store.Store[any], tc *types.TargetConfig)...
  function SetTargetConfigDefaultsExpandEnv (line 362) | func SetTargetConfigDefaultsExpandEnv(s store.Store[any], tc *types.Targ...

FILE: pkg/config/targets_test.go
  function TestGetTargets (line 323) | func TestGetTargets(t *testing.T) {
  function TestSetTargetLoaderConfigDefaults (line 400) | func TestSetTargetLoaderConfigDefaults(t *testing.T) {

FILE: pkg/config/tunnel_server.go
  constant defaultTargetWaitTime (line 23) | defaultTargetWaitTime = 2 * time.Second
  type TunnelServer (line 26) | type TunnelServer struct
  type TunnelTargetMatch (line 39) | type TunnelTargetMatch struct
  method GetTunnelServer (line 50) | func (c *Config) GetTunnelServer() error {
  method setTunnelServerDefaults (line 93) | func (c *Config) setTunnelServerDefaults() {

FILE: pkg/file/file.go
  constant defaultFTPPort (line 34) | defaultFTPPort  = 21
  constant defaultSFTPPort (line 35) | defaultSFTPPort = 22
  function ReadFile (line 42) | func ReadFile(ctx context.Context, path string) ([]byte, error) {
  function readHTTPFile (line 62) | func readHTTPFile(ctx context.Context, path string) ([]byte, error) {
  function readFTPFile (line 91) | func readFTPFile(ctx context.Context, path string) ([]byte, error) {
  function readSFTPFile (line 130) | func readSFTPFile(_ context.Context, path string, checkHostKey bool) ([]...
  function FileExists (line 221) | func FileExists(filename string) bool {

FILE: pkg/formatters/event.go
  type EventMsg (line 31) | type EventMsg struct
    method String (line 39) | func (e *EventMsg) String() string {
    method ToMap (line 324) | func (e *EventMsg) ToMap() map[string]interface{} {
  function ResponseToEventMsgs (line 45) | func ResponseToEventMsgs(name string, rsp *gnmi.SubscribeResponse, meta ...
  function GetResponseToEventMsgs (line 75) | func GetResponseToEventMsgs(rsp *gnmi.GetResponse, meta map[string]strin...
  function updatesToEvent (line 94) | func updatesToEvent(name, prefix string, ts int64, upds []*gnmi.Update, ...
  function updateToEvent (line 109) | func updateToEvent(name, prefix string, ts int64, upd *gnmi.Update, tags...
  function deleteToEvent (line 146) | func deleteToEvent(name, prefix string, ts int64, del *gnmi.Path, tags m...
  function tagsFromGNMIPath (line 182) | func tagsFromGNMIPath(p *gnmi.Path) (string, map[string]string) {
  function normalizeEmptyRFC7951 (line 224) | func normalizeEmptyRFC7951(v any) any {
  function getValueFlat (line 253) | func getValueFlat(prefix string, updValue *gnmi.TypedValue) (map[string]...
  function EventFromMap (line 351) | func EventFromMap(m map[string]interface{}) (*EventMsg, error) {
  function num64 (line 421) | func num64(n interface{}) interface{} {
  function addMetaTags (line 451) | func addMetaTags(e *EventMsg, meta map[string]string) {

FILE: pkg/formatters/event_add_tag/event_add_tag.go
  constant processorType (line 26) | processorType = "event-add-tag"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type addTag (line 31) | type addTag struct
    method Init (line 60) | func (p *addTag) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 115) | func (p *addTag) Apply(es ...*formatters.EventMsg) []*formatters.Event...
    method WithLogger (line 174) | func (p *addTag) WithLogger(l *log.Logger) {
    method addTags (line 182) | func (p *addTag) addTags(e *formatters.EventMsg) {
  function init (line 52) | func init() {
  function compileRegex (line 197) | func compileRegex(expr []string) ([]*regexp.Regexp, error) {

FILE: pkg/formatters/event_add_tag/event_add_tag_test.go
  type item (line 18) | type item struct
  function TestEventAddTag (line 910) | func TestEventAddTag(t *testing.T) {

FILE: pkg/formatters/event_allow/event_allow.go
  constant processorType (line 26) | processorType = "event-allow"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type allow (line 31) | type allow struct
    method Init (line 56) | func (d *allow) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 119) | func (d *allow) Apply(es ...*formatters.EventMsg) []*formatters.EventM...
    method WithLogger (line 134) | func (d *allow) WithLogger(l *log.Logger) {
    method allow (line 142) | func (d *allow) allow(e *formatters.EventMsg) bool {
  function init (line 48) | func init() {

FILE: pkg/formatters/event_allow/event_allow_test.go
  type item (line 18) | type item struct
  function TestEventAllow (line 296) | func TestEventAllow(t *testing.T) {

FILE: pkg/formatters/event_combine/event_combine.go
  constant processorType (line 28) | processorType = "event-combine"
  constant loggingPrefix (line 29) | loggingPrefix = "[" + processorType + "] "
  type combine (line 33) | type combine struct
    method Init (line 61) | func (p *combine) Init(cfg any, opts ...formatters.Option) error {
    method Apply (line 127) | func (p *combine) Apply(es ...*formatters.EventMsg) []*formatters.Even...
    method WithLogger (line 167) | func (s *combine) WithLogger(l *log.Logger) {
    method WithTargets (line 175) | func (s *combine) WithTargets(tcs map[string]*types.TargetConfig) {
    method WithActions (line 179) | func (s *combine) WithActions(act map[string]map[string]any) {
    method WithProcessors (line 183) | func (s *combine) WithProcessors(procs map[string]map[string]any) {
  type procseq (line 45) | type procseq struct
  function init (line 53) | func init() {

FILE: pkg/formatters/event_combine/event_combine_test/event_combine_test.go
  function Test_combine_Apply (line 19) | func Test_combine_Apply(t *testing.T) {

FILE: pkg/formatters/event_convert/event_convert.go
  constant processorType (line 27) | processorType = "event-convert"
  constant loggingPrefix (line 28) | loggingPrefix = "[" + processorType + "] "
  type convert (line 32) | type convert struct
    method Init (line 50) | func (c *convert) Init(cfg interface{}, opts ...formatters.Option) err...
    method Apply (line 77) | func (c *convert) Apply(es ...*formatters.EventMsg) []*formatters.Even...
    method WithLogger (line 128) | func (c *convert) WithLogger(l *log.Logger) {
  function init (line 42) | func init() {
  function convertToInt (line 136) | func convertToInt(i interface{}) (int, error) {
  function convertToUint (line 173) | func convertToUint(i interface{}) (uint, error) {
  function convertToFloat (line 231) | func convertToFloat(i interface{}) (float64, error) {
  function convertToString (line 274) | func convertToString(i interface{}) (string, error) {

FILE: pkg/formatters/event_convert/event_convert_test.go
  type item (line 19) | type item struct
  function TestEventConvertToUint (line 533) | func TestEventConvertToUint(t *testing.T) {
  function TestEventConvertToInt (line 561) | func TestEventConvertToInt(t *testing.T) {
  function TestEventConvertToString (line 588) | func TestEventConvertToString(t *testing.T) {
  function TestEventConvertToFloat (line 615) | func TestEventConvertToFloat(t *testing.T) {

FILE: pkg/formatters/event_data_convert/event_data_convert.go
  constant processorType (line 29) | processorType = "event-data-convert"
  constant loggingPrefix (line 30) | loggingPrefix = "[" + processorType + "] "
  type dataConvert (line 36) | type dataConvert struct
    method Init (line 59) | func (c *dataConvert) Init(cfg interface{}, opts ...formatters.Option)...
    method Apply (line 93) | func (c *dataConvert) Apply(es ...*formatters.EventMsg) []*formatters....
    method WithLogger (line 134) | func (c *dataConvert) WithLogger(l *log.Logger) {
    method convertData (line 142) | func (c *dataConvert) convertData(k string, i interface{}, from *units...
    method getNewName (line 321) | func (c *dataConvert) getNewName(k string) string {
  function init (line 51) | func init() {
  function sToU (line 241) | func sToU(s string) units.Unit {
  function parseStringUnit (line 293) | func parseStringUnit(s string) (float64, units.Unit, error) {
  function unitFromName (line 313) | func unitFromName(k string) *units.Unit {

FILE: pkg/formatters/event_data_convert/event_data_convert_test.go
  function Test_dataConvert_Apply (line 20) | func Test_dataConvert_Apply(t *testing.T) {

FILE: pkg/formatters/event_date_string/event_date_string.go
  constant processorType (line 26) | processorType = "event-date-string"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type dateString (line 33) | type dateString struct
    method Init (line 56) | func (d *dateString) Init(cfg interface{}, opts ...formatters.Option) ...
    method Apply (line 102) | func (d *dateString) Apply(es ...*formatters.EventMsg) []*formatters.E...
    method WithLogger (line 166) | func (d *dateString) WithLogger(l *log.Logger) {
  function init (line 48) | func init() {
  function convertToInt (line 174) | func convertToInt(i interface{}) (int, error) {

FILE: pkg/formatters/event_date_string/event_date_string_test.go
  type item (line 18) | type item struct
  function TestEventDateString (line 70) | func TestEventDateString(t *testing.T) {

FILE: pkg/formatters/event_delete/event_delete.go
  constant processorType (line 23) | processorType = "event-delete"
  constant loggingPrefix (line 24) | loggingPrefix = "[" + processorType + "] "
  type deletep (line 28) | type deletep struct
    method Init (line 53) | func (d *deletep) Init(cfg interface{}, opts ...formatters.Option) err...
    method Apply (line 108) | func (d *deletep) Apply(es ...*formatters.EventMsg) []*formatters.Even...
    method WithLogger (line 147) | func (d *deletep) WithLogger(l *log.Logger) {
  function init (line 45) | func init() {

FILE: pkg/formatters/event_delete/event_delete_test.go
  type item (line 18) | type item struct
  function TestEventDelete (line 638) | func TestEventDelete(t *testing.T) {

FILE: pkg/formatters/event_drop/event_drop.go
  constant processorType (line 26) | processorType = "event-drop"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type drop (line 31) | type drop struct
    method Init (line 56) | func (d *drop) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 119) | func (d *drop) Apply(es ...*formatters.EventMsg) []*formatters.EventMsg {
    method WithLogger (line 134) | func (d *drop) WithLogger(l *log.Logger) {
    method drop (line 142) | func (d *drop) drop(e *formatters.EventMsg) bool {
  function init (line 48) | func init() {

FILE: pkg/formatters/event_drop/event_drop_test.go
  type item (line 18) | type item struct
  function TestEventDrop (line 156) | func TestEventDrop(t *testing.T) {
  function BenchmarkApply (line 203) | func BenchmarkApply(b *testing.B) {

FILE: pkg/formatters/event_duration_convert/event_duration_convert.go
  constant processorType (line 25) | processorType = "event-duration-convert"
  constant loggingPrefix (line 26) | loggingPrefix = "[" + processorType + "] "
  type durationConvert (line 32) | type durationConvert struct
    method Init (line 50) | func (c *durationConvert) Init(cfg interface{}, opts ...formatters.Opt...
    method Apply (line 78) | func (c *durationConvert) Apply(es ...*formatters.EventMsg) []*formatt...
    method WithLogger (line 112) | func (c *durationConvert) WithLogger(l *log.Logger) {
    method convertDuration (line 120) | func (c *durationConvert) convertDuration(k string, i interface{}) (in...
  function init (line 42) | func init() {
  function parseStringDuration (line 157) | func parseStringDuration(s string) (int64, error) {

FILE: pkg/formatters/event_duration_convert/event_duration_convert_test.go
  constant oneMins (line 21) | oneMins = int64(60)
  constant oneHs (line 22) | oneHs   = int64(60 * 60)
  constant oneDs (line 23) | oneDs   = int64(24 * 60 * 60)
  constant oneWs (line 24) | oneWs   = int64(7 * 24 * 60 * 60)
  function Test_durationConvert_Apply (line 27) | func Test_durationConvert_Apply(t *testing.T) {

FILE: pkg/formatters/event_extract_tags/event_extract_tags.go
  constant processorType (line 23) | processorType = "event-extract-tags"
  constant loggingPrefix (line 24) | loggingPrefix = "[" + processorType + "] "
  type extractTags (line 28) | type extractTags struct
    method Init (line 52) | func (p *extractTags) Init(cfg interface{}, opts ...formatters.Option)...
    method Apply (line 108) | func (p *extractTags) Apply(es ...*formatters.EventMsg) []*formatters....
    method WithLogger (line 135) | func (p *extractTags) WithLogger(l *log.Logger) {
    method addTags (line 143) | func (p *extractTags) addTags(e *formatters.EventMsg, re *regexp.Regex...
  function init (line 44) | func init() {

FILE: pkg/formatters/event_extract_tags/event_extract_tags_test.go
  type item (line 18) | type item struct
  function TestEventAddTag (line 184) | func TestEventAddTag(t *testing.T) {

FILE: pkg/formatters/event_group_by/event_group_by.go
  constant processorType (line 25) | processorType = "event-group-by"
  constant loggingPrefix (line 26) | loggingPrefix = "[" + processorType + "] "
  type groupBy (line 31) | type groupBy struct
    method Init (line 48) | func (p *groupBy) Init(cfg interface{}, opts ...formatters.Option) err...
    method Apply (line 68) | func (p *groupBy) Apply(es ...*formatters.EventMsg) []*formatters.Even...
    method WithLogger (line 100) | func (p *groupBy) WithLogger(l *log.Logger) {
    method byTagsOld (line 108) | func (p *groupBy) byTagsOld(es []*formatters.EventMsg) []*formatters.E...
    method byTags (line 166) | func (p *groupBy) byTags(es []*formatters.EventMsg) []*formatters.Even...
  function init (line 40) | func init() {
  function generateKeyAndCheck (line 217) | func generateKeyAndCheck(tags map[string]string, keys []string) (uint64,...

FILE: pkg/formatters/event_group_by/event_group_by_test.go
  type item (line 19) | type item struct
  function TestEventGroupBy (line 606) | func TestEventGroupBy(t *testing.T) {
  function generateMockEvents (line 639) | func generateMockEvents(numEvents, numTags int) []*formatters.EventMsg {
  function BenchmarkByTags (line 658) | func BenchmarkByTags(b *testing.B) {
  function slicesEqual (line 677) | func slicesEqual(slice1, slice2 []*formatters.EventMsg) bool {
  function eventMsgEqual (line 703) | func eventMsgEqual(a, b *formatters.EventMsg) bool {

FILE: pkg/formatters/event_ieeefloat32/event_ieeefloat32.go
  constant processorType (line 30) | processorType = "event-ieeefloat32"
  constant loggingPrefix (line 31) | loggingPrefix = "[" + processorType + "] "
  type ieeefloat32 (line 35) | type ieeefloat32 struct
    method Init (line 54) | func (p *ieeefloat32) Init(cfg interface{}, opts ...formatters.Option)...
    method Apply (line 90) | func (p *ieeefloat32) Apply(es ...*formatters.EventMsg) []*formatters....
    method WithLogger (line 123) | func (p *ieeefloat32) WithLogger(l *log.Logger) {
    method decodeBase64String (line 131) | func (p *ieeefloat32) decodeBase64String(e any) (float32, error) {
  function init (line 46) | func init() {
  function compileRegex (line 153) | func compileRegex(expr []string) ([]*regexp.Regexp, error) {

FILE: pkg/formatters/event_ieeefloat32/event_ieeefloat32_test.go
  type item (line 18) | type item struct
  function TestEventIEEEFloat32 (line 97) | func TestEventIEEEFloat32(t *testing.T) {

FILE: pkg/formatters/event_jq/event_jq.go
  constant processorType (line 25) | processorType     = "event-jq"
  constant loggingPrefix (line 26) | loggingPrefix     = "[" + processorType + "] "
  constant defaultCondition (line 27) | defaultCondition  = "all([true])"
  constant defaultExpression (line 28) | defaultExpression = "."
  type jq (line 32) | type jq struct
    method Init (line 51) | func (p *jq) Init(cfg interface{}, opts ...formatters.Option) error {
    method setDefaults (line 82) | func (p *jq) setDefaults() {
    method Apply (line 91) | func (p *jq) Apply(es ...*formatters.EventMsg) []*formatters.EventMsg {
    method evaluateCondition (line 119) | func (p *jq) evaluateCondition(input map[string]interface{}) (bool, er...
    method applyExpression (line 143) | func (p *jq) applyExpression(input []interface{}) ([]*formatters.Event...
    method WithLogger (line 191) | func (p *jq) WithLogger(l *log.Logger) {
  function init (line 43) | func init() {

FILE: pkg/formatters/event_jq/event_jq_test.go
  type item (line 21) | type item struct
  function TestEventJQ (line 744) | func TestEventJQ(t *testing.T) {

FILE: pkg/formatters/event_merge/event_merge.go
  constant processorType (line 22) | processorType = "event-merge"
  constant loggingPrefix (line 23) | loggingPrefix = "[" + processorType + "] "
  type merge (line 27) | type merge struct
    method Init (line 43) | func (p *merge) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 63) | func (p *merge) Apply(es ...*formatters.EventMsg) []*formatters.EventM...
    method WithLogger (line 94) | func (p *merge) WithLogger(l *log.Logger) {
  function init (line 35) | func init() {
  function mergeEvents (line 102) | func mergeEvents(e1, e2 *formatters.EventMsg) {

FILE: pkg/formatters/event_merge/event_merge_test.go
  type item (line 18) | type item struct
  function TestEventMerge (line 203) | func TestEventMerge(t *testing.T) {

FILE: pkg/formatters/event_override_ts/event_override_ts.go
  constant processorType (line 23) | processorType = "event-override-ts"
  constant loggingPrefix (line 24) | loggingPrefix = "[" + processorType + "] "
  type overrideTS (line 28) | type overrideTS struct
    method Init (line 45) | func (o *overrideTS) Init(cfg any, opts ...formatters.Option) error {
    method Apply (line 67) | func (o *overrideTS) Apply(es ...*formatters.EventMsg) []*formatters.E...
    method WithLogger (line 88) | func (o *overrideTS) WithLogger(l *log.Logger) {
  function init (line 37) | func init() {

FILE: pkg/formatters/event_override_ts/event_override_ts_test.go
  type item (line 18) | type item struct
  function TestEventDateString (line 142) | func TestEventDateString(t *testing.T) {

FILE: pkg/formatters/event_plugin/plugin.go
  type EventProcessorPlugin (line 11) | type EventProcessorPlugin struct
    method Server (line 15) | func (p *EventProcessorPlugin) Server(*plugin.MuxBroker) (interface{},...
    method Client (line 19) | func (p *EventProcessorPlugin) Client(b *plugin.MuxBroker, c *rpc.Clie...

FILE: pkg/formatters/event_plugin/rpc.go
  constant processorType (line 15) | processorType = "event-plugin"
  constant loggingPrefix (line 16) | loggingPrefix = "[" + processorType + "] "
  type InitArgs (line 19) | type InitArgs struct
  type ApplyArgs (line 23) | type ApplyArgs struct
  type ApplyResponse (line 27) | type ApplyResponse struct
  type Actionresponse (line 32) | type Actionresponse struct
  type InitResponse (line 33) | type InitResponse struct
  type Targetresponse (line 34) | type Targetresponse struct
  type Proccessorresponse (line 35) | type Proccessorresponse struct
  type eventProcessorRPCServer (line 38) | type eventProcessorRPCServer struct
    method Init (line 47) | func (s *eventProcessorRPCServer) Init(args *InitArgs, resp *InitRespo...
    method Apply (line 51) | func (s *eventProcessorRPCServer) Apply(args *ApplyArgs, resp *ApplyRe...
    method WithActions (line 56) | func (s *eventProcessorRPCServer) WithActions(args map[string]map[stri...
    method WithTargets (line 61) | func (s *eventProcessorRPCServer) WithTargets(args map[string]*types.T...
    method WithProcessors (line 66) | func (s *eventProcessorRPCServer) WithProcessors(
    method WithLogger (line 74) | func (s *eventProcessorRPCServer) WithLogger() error {
  function init (line 42) | func init() {
  type EventProcessorRPC (line 78) | type EventProcessorRPC struct
    method Init (line 83) | func (g *EventProcessorRPC) Init(cfg interface{}, opts ...formatters.O...
    method Apply (line 94) | func (g *EventProcessorRPC) Apply(event ...*formatters.EventMsg) []*fo...
    method WithActions (line 104) | func (g *EventProcessorRPC) WithActions(act map[string]map[string]inte...
    method WithTargets (line 111) | func (g *EventProcessorRPC) WithTargets(tcs map[string]*types.TargetCo...
    method WithProcessors (line 118) | func (g *EventProcessorRPC) WithProcessors(procs map[string]map[string...
    method WithLogger (line 125) | func (g *EventProcessorRPC) WithLogger(l *log.Logger) {

FILE: pkg/formatters/event_rate_limit/event_rate_limit.go
  constant processorType (line 21) | processorType          = "event-rate-limit"
  constant loggingPrefix (line 22) | loggingPrefix          = "[" + processorType + "] "
  constant defaultCacheSize (line 23) | defaultCacheSize       = 1000
  constant oneSecond (line 24) | oneSecond        int64 = int64(time.Second)
  type rateLimit (line 33) | type rateLimit struct
    method Init (line 57) | func (o *rateLimit) Init(cfg interface{}, opts ...formatters.Option) e...
    method Apply (line 89) | func (o *rateLimit) Apply(es ...*formatters.EventMsg) []*formatters.Ev...
    method WithLogger (line 132) | func (o *rateLimit) WithLogger(l *log.Logger) {
  function init (line 49) | func init() {
  function hashEvent (line 112) | func hashEvent(e *formatters.EventMsg) string {

FILE: pkg/formatters/event_rate_limit/event_rate_limit_test.go
  type item (line 9) | type item struct
  function TestRateLimit (line 335) | func TestRateLimit(t *testing.T) {

FILE: pkg/formatters/event_starlark/dict.go
  type isDict (line 20) | type isDict interface
  type dict (line 27) | type dict struct
  function newDict (line 34) | func newDict[K comparable, V any](name string, m map[K]V) *dict[K, V] {
  type builtinMethod (line 41) | type builtinMethod
  function builtinAttr (line 44) | func builtinAttr(recv starlark.Value, name string, methods map[string]bu...
  function builtinAttrNames (line 57) | func builtinAttrNames(methods map[string]builtinMethod) []string {
  method String (line 67) | func (d *dict[K, V]) String() string {
  method Type (line 73) | func (d *dict[K, V]) Type() string {
  method Freeze (line 78) | func (d *dict[K, V]) Freeze() {
  method Truth (line 83) | func (d *dict[K, V]) Truth() starlark.Bool {
  method Hash (line 88) | func (d *dict[K, V]) Hash() (uint32, error) {
  method AttrNames (line 93) | func (d *dict[K, V]) AttrNames() []string {
  method Attr (line 98) | func (d *dict[K, V]) Attr(name string) (starlark.Value, error) {
  method Get (line 114) | func (d *dict[K, V]) Get(key starlark.Value) (v starlark.Value, found bo...
  method SetKey (line 132) | func (d *dict[K, V]) SetKey(k, v starlark.Value) error {
  method Items (line 158) | func (d *dict[K, V]) Items() []starlark.Tuple {
  method Clear (line 175) | func (d *dict[K, V]) Clear() error {
  method Delete (line 185) | func (d *dict[K, V]) Delete(k starlark.Value) (v starlark.Value, found b...
  method Iterate (line 207) | func (d *dict[K, V]) Iterate() starlark.Iterator {
  type tag (line 219) | type tag struct
  type dictIterator (line 224) | type dictIterator struct
  method Next (line 230) | func (i *dictIterator[K, V]) Next(p *starlark.Value) bool {
  method Done (line 247) | func (i *dictIterator[K, V]) Done() {
  function dictClear (line 254) | func dictClear(b *starlark.Builtin, args starlark.Tuple, kwargs []starla...
  function dictPop (line 263) | func dictPop(b *starlark.Builtin, args starlark.Tuple, kwargs []starlark...
  function dictGet (line 283) | func dictGet(b *starlark.Builtin, args starlark.Tuple, kwargs []starlark...
  function dictSetDefault (line 302) | func dictSetDefault(b *starlark.Builtin, args starlark.Tuple, kwargs []s...
  function dictUpdate (line 324) | func dictUpdate(b *starlark.Builtin, args starlark.Tuple, kwargs []starl...
  function dictItems (line 400) | func dictItems(b *starlark.Builtin, args starlark.Tuple, kwargs []starla...
  function dictKeys (line 413) | func dictKeys(b *starlark.Builtin, args starlark.Tuple, kwargs []starlar...
  function dictValues (line 427) | func dictValues(b *starlark.Builtin, args starlark.Tuple, kwargs []starl...

FILE: pkg/formatters/event_starlark/event.go
  type event (line 22) | type event struct
    method String (line 41) | func (s *event) String() string {
    method Type (line 47) | func (s *event) Type() string { return "Event" }
    method Freeze (line 50) | func (s *event) Freeze() { s.frozen = true }
    method Truth (line 53) | func (s *event) Truth() starlark.Bool { return starlark.True }
    method Hash (line 56) | func (s *event) Hash() (uint32, error) { return 0, errors.New("not has...
    method AttrNames (line 59) | func (s *event) AttrNames() []string {
    method Attr (line 64) | func (s *event) Attr(name string) (starlark.Value, error) {
    method SetField (line 83) | func (s *event) SetField(name string, value starlark.Value) error {
    method SetName (line 105) | func (s *event) SetName(name starlark.Value) error {
    method Tags (line 113) | func (s *event) Tags() starlark.Value {
    method Values (line 117) | func (s *event) Values() starlark.Value {
    method Deletes (line 121) | func (s *event) Deletes() starlark.Value {
    method Timestamp (line 133) | func (s *event) Timestamp() starlark.Int {
    method SetTimestamp (line 137) | func (s *event) SetTimestamp(value starlark.Value) error {
    method SetTags (line 151) | func (s *event) SetTags(value starlark.Value) error {
    method SetValues (line 160) | func (s *event) SetValues(value starlark.Value) error {
    method SetDeletes (line 169) | func (s *event) SetDeletes(value starlark.Value) error {
  function fromEvent (line 27) | func fromEvent(ev *formatters.EventMsg) *event {
  function toEvent (line 33) | func toEvent(sev *event) *formatters.EventMsg {
  function newEvent (line 178) | func newEvent(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tup...
  function toValues (line 224) | func toValues(value starlark.Value) (map[string]any, error) {
  function toTags (line 246) | func toTags(value starlark.Value) (map[string]string, error) {
  function toDeletes (line 268) | func toDeletes(value starlark.Value) ([]string, error) {
  function toStarlarkValue (line 293) | func toStarlarkValue(value any) (starlark.Value, error) {
  function toGoVal (line 337) | func toGoVal(value starlark.Value) (any, error) {
  function copyEvent (line 356) | func copyEvent(_ *starlark.Thread, _ *starlark.Builtin, args starlark.Tu...

FILE: pkg/formatters/event_starlark/event_starlark.go
  constant processorType (line 30) | processorType = "event-starlark"
  constant loggingPrefix (line 31) | loggingPrefix = "[" + processorType + "] "
  type starlarkProc (line 35) | type starlarkProc struct
    method Init (line 57) | func (p *starlarkProc) Init(cfg interface{}, opts ...formatters.Option...
    method validate (line 110) | func (p *starlarkProc) validate() error {
    method Apply (line 120) | func (p *starlarkProc) Apply(es ...*formatters.EventMsg) []*formatters...
    method WithLogger (line 186) | func (p *starlarkProc) WithLogger(l *log.Logger) {
    method sourceProgram (line 194) | func (p *starlarkProc) sourceProgram(builtins starlark.StringDict) (*s...
  function init (line 49) | func init() {
  function loadModule (line 208) | func loadModule(module string) (starlark.StringDict, error) {

FILE: pkg/formatters/event_starlark/event_starlark_test.go
  function Test_starlarkProc_Apply (line 20) | func Test_starlarkProc_Apply(t *testing.T) {

FILE: pkg/formatters/event_strings/event_strings.go
  constant processorType (line 28) | processorType = "event-strings"
  constant loggingPrefix (line 29) | loggingPrefix = "[" + processorType + "] "
  constant nameField (line 30) | nameField     = "name"
  constant valueField (line 31) | valueField    = "value"
  type stringsp (line 35) | type stringsp struct
    method Init (line 88) | func (s *stringsp) Init(cfg interface{}, opts ...formatters.Option) er...
    method Apply (line 155) | func (s *stringsp) Apply(es ...*formatters.EventMsg) []*formatters.Eve...
    method WithLogger (line 194) | func (s *stringsp) WithLogger(l *log.Logger) {
    method applyValueTransformations (line 202) | func (s *stringsp) applyValueTransformations(e *formatters.EventMsg, k...
    method applyTagTransformations (line 214) | func (s *stringsp) applyTagTransformations(e *formatters.EventMsg, k, ...
  type transform (line 53) | type transform struct
    method apply (line 232) | func (t *transform) apply(k string, v interface{}) (string, interface{...
    method replace (line 254) | func (t *transform) replace(k string, v interface{}) (string, interfac...
    method trimPrefix (line 266) | func (t *transform) trimPrefix(k string, v interface{}) (string, inter...
    method trimSuffix (line 278) | func (t *transform) trimSuffix(k string, v interface{}) (string, inter...
    method toTitle (line 290) | func (t *transform) toTitle(k string, v interface{}) (string, interfac...
    method toLower (line 302) | func (t *transform) toLower(k string, v interface{}) (string, interfac...
    method toUpper (line 314) | func (t *transform) toUpper(k string, v interface{}) (string, interfac...
    method split (line 326) | func (t *transform) split(k string, v interface{}) (string, interface{...
    method pathBase (line 348) | func (t *transform) pathBase(k string, v interface{}) (string, interfa...
  function init (line 80) | func init() {

FILE: pkg/formatters/event_strings/event_strings_test.go
  type item (line 18) | type item struct
  function TestEventStrings (line 534) | func TestEventStrings(t *testing.T) {

FILE: pkg/formatters/event_test.go
  type item (line 20) | type item struct
  function TestToMap (line 100) | func TestToMap(t *testing.T) {
  function TestFromMap (line 117) | func TestFromMap(t *testing.T) {
  function TestTagsFromGNMIPath (line 138) | func TestTagsFromGNMIPath(t *testing.T) {
  function Test_getValueFlat (line 274) | func Test_getValueFlat(t *testing.T) {
  function TestResponseToEventMsgs (line 355) | func TestResponseToEventMsgs(t *testing.T) {

FILE: pkg/formatters/event_time_epoch/event_time_epoch.go
  constant processorType (line 24) | processorType = "event-time-epoch"
  constant loggingPrefix (line 25) | loggingPrefix = "[" + processorType + "] "
  type epoch (line 29) | type epoch struct
    method Init (line 49) | func (d *epoch) Init(cfg any, opts ...formatters.Option) error {
    method Apply (line 80) | func (d *epoch) Apply(es ...*formatters.EventMsg) []*formatters.EventM...
    method WithLogger (line 120) | func (d *epoch) WithLogger(l *log.Logger) {
  function init (line 41) | func init() {

FILE: pkg/formatters/event_time_epoch/event_time_epoch_test.go
  function Test_epoch_Apply (line 20) | func Test_epoch_Apply(t *testing.T) {

FILE: pkg/formatters/event_to_tag/event_to_tag.go
  constant processorType (line 24) | processorType = "event-to-tag"
  constant loggingPrefix (line 25) | loggingPrefix = "[" + processorType + "] "
  type toTag (line 30) | type toTag struct
    method Init (line 52) | func (t *toTag) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 87) | func (t *toTag) Apply(es ...*formatters.EventMsg) []*formatters.EventM...
    method Apply2 (line 124) | func (t *toTag) Apply2(es ...*formatters.EventMsg) []*formatters.Event...
    method WithLogger (line 156) | func (t *toTag) WithLogger(l *log.Logger) {
  function init (line 44) | func init() {

FILE: pkg/formatters/event_to_tag/event_to_tag_test.go
  type item (line 20) | type item struct
  function TestEventToTag (line 227) | func TestEventToTag(t *testing.T) {
  function generateTestMessages (line 259) | func generateTestMessages(count int) []*formatters.EventMsg {
  function BenchmarkApply (line 276) | func BenchmarkApply(b *testing.B) {
  function BenchmarkApply2 (line 297) | func BenchmarkApply2(b *testing.B) {

FILE: pkg/formatters/event_trigger/event_trigger.go
  constant processorType (line 35) | processorType    = "event-trigger"
  constant loggingPrefix (line 36) | loggingPrefix    = "[" + processorType + "] "
  constant defaultCondition (line 37) | defaultCondition = "any([true])"
  type trigger (line 41) | type trigger struct
    method Init (line 73) | func (p *trigger) Init(cfg interface{}, opts ...formatters.Option) err...
    method Apply (line 117) | func (p *trigger) Apply(es ...*formatters.EventMsg) []*formatters.Even...
    method WithLogger (line 144) | func (p *trigger) WithLogger(l *log.Logger) {
    method WithTargets (line 152) | func (p *trigger) WithTargets(tcs map[string]*types.TargetConfig) {
    method WithActions (line 156) | func (p *trigger) WithActions(acts map[string]map[string]interface{}) {
    method initializeAction (line 163) | func (p *trigger) initializeAction(cfg map[string]interface{}) error {
    method String (line 187) | func (p *trigger) String() string {
    method setDefaults (line 195) | func (p *trigger) setDefaults() error {
    method readVars (line 214) | func (p *trigger) readVars() error {
    method triggerActions (line 232) | func (p *trigger) triggerActions(e *formatters.EventMsg) {
    method evalOccurrencesWithinWindow (line 245) | func (p *trigger) evalOccurrencesWithinWindow(now time.Time) bool {
    method WithProcessors (line 284) | func (p *trigger) WithProcessors(procs map[string]map[string]any) {}
  function init (line 65) | func init() {

FILE: pkg/formatters/event_trigger/event_trigger_test.go
  type item (line 22) | type item struct
  function TestEventTrigger (line 322) | func TestEventTrigger(t *testing.T) {
  function TestOccurrenceTrigger (line 358) | func TestOccurrenceTrigger(t *testing.T) {

FILE: pkg/formatters/event_value_tag/event_value_tag.go
  constant processorType (line 23) | processorType = "event-value-tag"
  constant loggingPrefix (line 24) | loggingPrefix = "[" + processorType + "] "
  type valueTag (line 27) | type valueTag struct
    method Init (line 42) | func (vt *valueTag) Init(cfg interface{}, opts ...formatters.Option) e...
    method Apply (line 70) | func (vt *valueTag) Apply(evs ...*formatters.EventMsg) []*formatters.E...
    method WithLogger (line 88) | func (vt *valueTag) WithLogger(l *log.Logger) {
    method WithProcessors (line 109) | func (vt *valueTag) WithProcessors(procs map[string]map[string]any) {}
    method buildApplyRules (line 111) | func (vt *valueTag) buildApplyRules(evs []*formatters.EventMsg) []*tag...
  function init (line 36) | func init() {
  type tagVal (line 65) | type tagVal struct
  function compareTags (line 97) | func compareTags(a map[string]string, b map[string]string) bool {
  function copyTags (line 128) | func copyTags(src map[string]string) map[string]string {

FILE: pkg/formatters/event_value_tag/event_value_tag_test.go
  type item (line 20) | type item struct
  function TestEventValueTag (line 387) | func TestEventValueTag(t *testing.T) {
  function generateEventMsgs (line 416) | func generateEventMsgs(numEvents, numValues int, targetKey, targetValue ...
  function BenchmarkBuildApplyRules (line 432) | func BenchmarkBuildApplyRules(b *testing.B) {
  function BenchmarkBuildApplyRules2 (line 442) | func BenchmarkBuildApplyRules2(b *testing.B) {
  method buildApplyRules2 (line 453) | func (vt *valueTag) buildApplyRules2(evs []*formatters.EventMsg) []*tagV...

FILE: pkg/formatters/event_value_tag_v2/event_value_tag_v2.go
  constant processorType (line 26) | processorType = "event-value-tag-v2"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type valueTag (line 36) | type valueTag struct
    method Init (line 58) | func (vt *valueTag) Init(cfg interface{}, opts ...formatters.Option) e...
    method Apply (line 97) | func (vt *valueTag) Apply(evs ...*formatters.EventMsg) []*formatters.E...
    method WithLogger (line 129) | func (vt *valueTag) WithLogger(l *log.Logger) {
    method applyRuleKey (line 152) | func (vt *valueTag) applyRuleKey(m map[string]string, r *rule) uint64 {
  type rule (line 46) | type rule struct
  function init (line 52) | func init() {
  type applyRule (line 88) | type applyRule struct
  function includedIn (line 139) | func includedIn(a, b map[string]string) bool {
  function copyTags (line 171) | func copyTags(src map[string]string) map[string]string {

FILE: pkg/formatters/event_value_tag_v2/event_value_tag_v2_test.go
  type item (line 23) | type item struct
  function TestEventValueTag (line 469) | func TestEventValueTag(t *testing.T) {
  function TestValueTagApplySubsequentRuns (line 500) | func TestValueTagApplySubsequentRuns(t *testing.T) {

FILE: pkg/formatters/event_write/event_write.go
  constant processorType (line 26) | processorType = "event-write"
  constant loggingPrefix (line 27) | loggingPrefix = "[" + processorType + "] "
  type write (line 30) | type write struct
    method Init (line 60) | func (p *write) Init(cfg interface{}, opts ...formatters.Option) error {
    method Apply (line 138) | func (p *write) Apply(es ...*formatters.EventMsg) []*formatters.EventM...
    method WithLogger (line 207) | func (p *write) WithLogger(l *log.Logger) {
    method write (line 215) | func (p *write) write(e *formatters.EventMsg) error {
  function init (line 52) | func init() {

FILE: pkg/formatters/event_write/event_write_test.go
  type item (line 20) | type item struct
  function TestEventWrite (line 217) | func TestEventWrite(t *testing.T) {

FILE: pkg/formatters/flat.go
  function ResponsesFlat (line 21) | func ResponsesFlat(msgs ...proto.Message) (map[string]interface{}, error) {
  function responseFlat (line 35) | func responseFlat(msg proto.Message) (map[string]interface{}, error) {

FILE: pkg/formatters/formats.go
  type MarshalOptions (line 25) | type MarshalOptions struct
    method Marshal (line 38) | func (o *MarshalOptions) Marshal(msg proto.Message, meta map[string]st...
    method OverrideTimestamp (line 119) | func (o *MarshalOptions) OverrideTimestamp(msg proto.Message) proto.Me...

FILE: pkg/formatters/json.go
  function jsonMarshal (line 35) | func jsonMarshal(v any) ([]byte, error) {
  function jsonMarshalIndent (line 53) | func jsonMarshalIndent(v any, prefix, indent string) ([]byte, error) {
  function formatRegisteredExtensions (line 71) | func formatRegisteredExtensions(
  method FormatJSON (line 138) | func (o *MarshalOptions) FormatJSON(m proto.Message, meta map[string]str...
  method formatSubscribeRequest (line 163) | func (o *MarshalOptions) formatSubscribeRequest(m *gnmi.SubscribeRequest...
  method formatSubscribeResponse (line 201) | func (o *MarshalOptions) formatSubscribeResponse(m *gnmi.SubscribeRespon...
  method formatCapabilitiesRequest (line 292) | func (o *MarshalOptions) formatCapabilitiesRequest(m *gnmi.CapabilityReq...
  method formatCapabilitiesResponse (line 302) | func (o *MarshalOptions) formatCapabilitiesResponse(m *gnmi.CapabilityRe...
  method formatGetRequest (line 324) | func (o *MarshalOptions) formatGetRequest(m *gnmi.GetRequest) ([]byte, e...
  method formatGetResponse (line 350) | func (o *MarshalOptions) formatGetResponse(m *gnmi.GetResponse, meta map...
  method formatSetRequest (line 432) | func (o *MarshalOptions) formatSetRequest(m *gnmi.SetRequest) ([]byte, e...
  method formatSetResponse (line 466) | func (o *MarshalOptions) formatSetResponse(m *gnmi.SetResponse, meta map...

FILE: pkg/formatters/msg.go
  type syncResponseMsg (line 19) | type syncResponseMsg struct
  type notificationRspMsg (line 25) | type notificationRspMsg struct
  type update (line 43) | type update struct
  type capRequest (line 47) | type capRequest struct
  type capResponse (line 50) | type capResponse struct
  type model (line 56) | type model struct
  type getRqMsg (line 62) | type getRqMsg struct
  type decodedExtension (line 72) | type decodedExtension
  type getRspMsg (line 74) | type getRspMsg struct
  type setRspMsg (line 79) | type setRspMsg struct
  type updateResultMsg (line 90) | type updateResultMsg struct
  type setReqMsg (line 96) | type setReqMsg struct
  type updateMsg (line 105) | type updateMsg struct
  type subscribeReq (line 110) | type subscribeReq struct
  type poll (line 117) | type poll struct
  type subscribe (line 119) | type subscribe struct
  type subscription (line 132) | type subscription struct
  function getValue (line 140) | func getValue(updValue *gnmi.TypedValue) (interface{}, error) {

FILE: pkg/formatters/plugin_manager/manager.go
  type PluginManager (line 25) | type PluginManager struct
    method Load (line 56) | func (p *PluginManager) Load() error {
    method Cleanup (line 76) | func (p *PluginManager) Cleanup() {
    method initProcessorFn (line 84) | func (p *PluginManager) initProcessorFn(name, pluginPath string) func(...
  function New (line 35) | func New(pc *config.PluginsConfig, logOutput io.Writer) *PluginManager {

FILE: pkg/formatters/processors.go
  type Initializer (line 50) | type Initializer
  function Register (line 52) | func Register(name string, initFn Initializer) {
  type Option (line 56) | type Option
  type EventProcessor (line 58) | type EventProcessor interface
  function DecodeConfig (line 68) | func DecodeConfig(src, dst interface{}) error {
  function WithLogger (line 81) | func WithLogger(l *log.Logger) Option {
  function WithTargets (line 87) | func WithTargets(tcs map[string]*types.TargetConfig) Option {
  function WithActions (line 93) | func WithActions(acts map[string]map[string]interface{}) Option {
  function WithProcessors (line 99) | func WithProcessors(procs map[string]map[string]interface{}) Option {
  function CheckCondition (line 105) | func CheckCondition(code *gojq.Code, e *EventMsg) (bool, error) {
  function MakeEventProcessors (line 140) | func MakeEventProcessors(
  function MakeProcessor (line 162) | func MakeProcessor(logger *log.Logger, name string,
  type BaseProcessor (line 189) | type BaseProcessor struct
    method WithLogger (line 193) | func (p *BaseProcessor) WithLogger(l *log.Logger) {
    method Init (line 197) | func (p *BaseProcessor) Init(interface{}, ...Option) error {
    method Apply (line 201) | func (p *BaseProcessor) Apply(...*EventMsg) []*EventMsg {
    method WithTargets (line 205) | func (p *BaseProcessor) WithTargets(map[string]*types.TargetConfig) {
    method WithActions (line 208) | func (p *BaseProcessor) WithActions(act map[string]map[string]interfac...
    method WithProcessors (line 211) | func (p *BaseProcessor) WithProcessors(procs map[string]map[string]any) {

FILE: pkg/formatters/processors_test.go
  function TestCheckCondition (line 47) | func TestCheckCondition(t *testing.T) {

FILE: pkg/gtemplate/template.go
  function CreateTemplate (line 16) | func CreateTemplate(name, text string) (*template.Template, error) {
  function CreateFileTemplate (line 23) | func CreateFileTemplate(filename string) (*template.Template, error) {

FILE: pkg/gtemplate/template_funcs.go
  type templateEngine (line 19) | type templateEngine interface
  function NewTemplateEngine (line 23) | func NewTemplateEngine() templateEngine {
  type gmplt (line 27) | type gmplt struct
    method CreateFuncs (line 29) | func (*gmplt) CreateFuncs() template.FuncMap {

FILE: pkg/inputs/input.go
  type Input (line 24) | type Input interface
  type Initializer (line 40) | type Initializer
  function Register (line 50) | func Register(name string, initFn Initializer) {
  type InputOptions (line 54) | type InputOptions struct
  type PipeMessage (line 62) | type PipeMessage interface
  type Option (line 69) | type Option
  function WithLogger (line 71) | func WithLogger(logger *log.Logger) Option {
  function WithOutputs (line 78) | func WithOutputs(outs map[string]outputs.Output) Option {
  function WithName (line 85) | func WithName(name string) Option {
  function WithConfigStore (line 92) | func WithConfigStore(st store.Store[any]) Option {
  function WithPipeline (line 99) | func WithPipeline(pipeline chan *pipeline.Msg) Option {
  type BaseInput (line 106) | type BaseInput struct
    method Start (line 109) | func (b *BaseInput) Start(context.Context, string, map[string]any, ......
    method Validate (line 113) | func (b *BaseInput) Validate(map[string]any) error {
    method Update (line 117) | func (b *BaseInput) Update(map[string]any) error {
    method UpdateProcessor (line 121) | func (b *BaseInput) UpdateProcessor(string, map[string]any) error {
    method Close (line 125) | func (b *BaseInput) Close() error {
  function UpdateProcessorInSlice (line 129) | func UpdateProcessorInSlice(

FILE: pkg/inputs/jetstream_input/jetstream_input.go
  constant loggingPrefix (line 41) | loggingPrefix           = "[jetstream_input:%s] "
  constant natsReconnectBufferSize (line 42) | natsReconnectBufferSize = 100 * 1024 * 1024
  constant defaultAddress (line 43) | defaultAddress          = "localhost:4222"
  constant natsConnectWait (line 44) | natsConnectWait         = 2 * time.Second
  constant defaultFormat (line 45) | defaultFormat           = "event"
  constant defaultNumWorkers (line 46) | defaultNumWorkers       = 1
  constant defaultBufferSize (line 47) | defaultBufferSize       = 500
  constant defaultFetchBatchSize (line 48) | defaultFetchBatchSize   = 500
  constant defaultMaxAckPending (line 49) | defaultMaxAckPending    = 1000
  type deliverPolicy (line 52) | type deliverPolicy
  constant deliverPolicyAll (line 55) | deliverPolicyAll            deliverPolicy = "all"
  constant deliverPolicyLast (line 56) | deliverPolicyLast           deliverPolicy = "last"
  constant deliverPolicyNew (line 57) | deliverPolicyNew            deliverPolicy = "new"
  constant deliverPolicyLastPerSubject (line 58) | deliverPolicyLastPerSubject deliverPolicy = "last-per-subject"
  function toJSDeliverPolicy (line 61) | func toJSDeliverPolicy(dp deliverPolicy) jetstream.DeliverPolicy {
  function init (line 75) | func init() {
  type jetstreamInput (line 88) | type jetstreamInput struct
    method Start (line 143) | func (n *jetstreamInput) Start(ctx context.Context, name string, cfg m...
    method Validate (line 197) | func (n *jetstreamInput) Validate(cfg map[string]any) error {
    method Update (line 209) | func (n *jetstreamInput) Update(cfg map[string]any) error {
    method UpdateProcessor (line 270) | func (n *jetstreamInput) UpdateProcessor(name string, pcfg map[string]...
    method worker (line 325) | func (n *jetstreamInput) worker(ctx context.Context, idx int) {
    method doWork (line 356) | func (n *jetstreamInput) doWork(ctx context.Context, workerIdx int, wC...
    method msgHandler (line 438) | func (n *jetstreamInput) msgHandler(ctx context.Context, cfg *config, ...
    method getMetaFromSubject (line 510) | func (n *jetstreamInput) getMetaFromSubject(subject string, wCfg *conf...
    method Close (line 530) | func (n *jetstreamInput) Close() error {
    method setLogger (line 541) | func (n *jetstreamInput) setLogger(logger *log.Logger) {
    method getOutputs (line 549) | func (n *jetstreamInput) getOutputs(outs map[string]outputs.Output, cf...
    method setName (line 568) | func (n *jetstreamInput) setName(name string, cfg *config) {
    method buildEventProcessors (line 579) | func (n *jetstreamInput) buildEventProcessors(logger *log.Logger, even...
    method setDefaultsFor (line 595) | func (n *jetstreamInput) setDefaultsFor(cfg *config) error {
    method createNATSConn (line 635) | func (n *jetstreamInput) createNATSConn(c *config) (*nats.Conn, error) {
    method Dial (line 673) | func (n *jetstreamInput) Dial(network, address string) (net.Conn, erro...
  type dynConfig (line 107) | type dynConfig struct
  type subjectFormat (line 112) | type subjectFormat
  constant subjectFormat_Static (line 115) | subjectFormat_Static    = "static"
  constant subjectFormat_TargetSub (line 116) | subjectFormat_TargetSub = "target.subscription"
  constant subjectFormat_SubTarget (line 117) | subjectFormat_SubTarget = "subscription.target"
  type config (line 121) | type config struct
  function needsWorkerRestart (line 297) | func needsWorkerRestart(old, nw *config) bool {
  function maxAckPendingEqual (line 315) | func maxAckPendingEqual(a, b *int) bool {

FILE: pkg/inputs/jetstream_input/jetstream_input_test.go
  function Test_setDefaults (line 11) | func Test_setDefaults(t *testing.T) {
  function Test_toJSDeliverPolicy (line 178) | func Test_toJSDeliverPolicy(t *testing.T) {
  function Test_workqueueDeliverPolicy (line 230) | func Test_workqueueDeliverPolicy(t *testing.T) {

FILE: pkg/inputs/kafka_input/kafka_input.go
  constant loggingPrefix (line 40) | loggingPrefix            = "[kafka_input] "
  constant defaultFormat (line 41) | defaultFormat            = "event"
  constant defaultTopic (line 42) | defaultTopic             = "telemetry"
  constant defaultNumWorkers (line 43) | defaultNumWorkers        = 1
  constant defaultSessionTimeout (line 44) | defaultSessionTimeout    = 10 * time.Second
  constant defaultHeartbeatInterval (line 45) | defaultHeartbeatInterval = 3 * time.Second
  constant defaultRecoveryWaitTime (line 46) | defaultRecoveryWaitTime  = 2 * time.Second
  constant defaultAddress (line 47) | defaultAddress           = "localhost:9092"
  constant defaultGroupID (line 48) | defaultGroupID           = "gnmic-consumers"
  function init (line 56) | func init() {
  type KafkaInput (line 69) | type KafkaInput struct
    method Start (line 114) | func (k *KafkaInput) Start(ctx context.Context, name string, cfg map[s...
    method Validate (line 167) | func (k *KafkaInput) Validate(cfg map[string]any) error {
    method Update (line 179) | func (k *KafkaInput) Update(cfg map[string]any) error {
    method UpdateProcessor (line 240) | func (k *KafkaInput) UpdateProcessor(name string, pcfg map[string]any)...
    method worker (line 267) | func (k *KafkaInput) worker(ctx context.Context, idx int) {
    method doWork (line 299) | func (k *KafkaInput) doWork(ctx context.Context, wCfg *config, workerL...
    method Close (line 448) | func (k *KafkaInput) Close() error {
    method partitionKeyToMeta (line 462) | func (k *KafkaInput) partitionKeyToMeta(key []byte) outputs.Meta {
    method setLogger (line 476) | func (k *KafkaInput) setLogger(logger *log.Logger) {
    method getOutputs (line 483) | func (k *KafkaInput) getOutputs(outs map[string]outputs.Output, cfg *c...
    method setName (line 502) | func (k *KafkaInput) setName(name string, cfg *config) {
    method buildEventProcessors (line 513) | func (k *KafkaInput) buildEventProcessors(logger *log.Logger, eventPro...
    method setDefaultsFor (line 529) | func (k *KafkaInput) setDefaultsFor(cfg *config) error {
    method createConfig (line 586) | func (k *KafkaInput) createConfig(cfg *config) (*sarama.Config, error) {
  type dynConfig (line 88) | type dynConfig struct
  type config (line 94) | type config struct
  constant partitionKeySeparator (line 459) | partitionKeySeparator = ":::"
  function needsWorkerRestart (line 630) | func needsWorkerRestart(old, nw *config) bool {
  function saslEq (line 646) | func saslEq(a, b *types.SASL) bool {
  type consumer (line 662) | type consumer struct
    method Setup (line 668) | func (consumer *consumer) Setup(sarama.ConsumerGroupSession) error {
    method Cleanup (line 675) | func (consumer *consumer) Cleanup(sarama.ConsumerGroupSession) error {
    method ConsumeClaim (line 680) | func (consumer *consumer) ConsumeClaim(session sarama.ConsumerGroupSes...

FILE: pkg/inputs/kafka_input/kafka_scram_client.go
  type XDGSCRAMClient (line 22) | type XDGSCRAMClient struct
    method Begin (line 28) | func (x *XDGSCRAMClient) Begin(userName, password, authzID string) (er...
    method Step (line 37) | func (x *XDGSCRAMClient) Step(challenge string) (response string, err ...
    method Done (line 42) | func (x *XDGSCRAMClient) Done() bool {

FILE: pkg/inputs/nats_input/nats_input.go
  constant loggingPrefix (line 40) | loggingPrefix           = "[nats_input] "
  constant natsReconnectBufferSize (line 41) | natsReconnectBufferSize = 100 * 1024 * 1024
  constant defaultAddress (line 42) | defaultAddress          = "localhost:4222"
  constant natsConnectWait (line 43) | natsConnectWait         = 2 * time.Second
  constant defaultFormat (line 44) | defaultFormat           = "event"
  constant defaultSubject (line 45) | defaultSubject          = "telemetry"
  constant defaultNumWorkers (line 46) | defaultNumWorkers       = 1
  constant defaultBufferSize (line 47) | defaultBufferSize       = 100
  function init (line 50) | func init() {
  type natsInput (line 63) | type natsInput struct
    method Start (line 106) | func (n *natsInput) Start(ctx context.Context, name string, cfg map[st...
    method Validate (line 160) | func (n *natsInput) Validate(cfg map[string]any) error {
    method Update (line 172) | func (n *natsInput) Update(cfg map[string]any) error {
    method UpdateProcessor (line 233) | func (n *natsInput) UpdateProcessor(name string, pcfg map[string]any) ...
    method worker (line 275) | func (n *natsInput) worker(ctx context.Context, idx int) {
    method doWork (line 308) | func (n *natsInput) doWork(ctx context.Context, wCfg *config, workerLo...
    method Close (line 408) | func (n *natsInput) Close() error {
    method setLogger (line 419) | func (n *natsInput) setLogger(logger *log.Logger) {
    method getOutputs (line 427) | func (n *natsInput) getOutputs(outs map[string]outputs.Output, cfg *co...
    method setName (line 446) | func (n *natsInput) setName(name string, cfg *config) {
    method buildEventProcessors (line 457) | func (n *natsInput) buildEventProcessors(logger *log.Logger, eventProc...
    method setDefaultsFor (line 473) | func (n *natsInput) setDefaultsFor(cfg *config) error {
    method createNATSConn (line 505) | func (n *natsInput) createNATSConn(c *config) (*nats.Conn, error) {
    method Dial (line 543) | func (n *natsInput) Dial(network, address string) (net.Conn, error) {
  type dynConfig (line 82) | type dynConfig struct
  type config (line 88) | type config struct
  function needsWorkerRestart (line 260) | func needsWorkerRestart(old, nw *config) bool {

FILE: pkg/loaders/consul_loader/consul_loader.go
  constant loggingPrefix (line 40) | loggingPrefix  = "[consul_loader] "
  constant loaderType (line 41) | loaderType     = "consul"
  constant defaultAddress (line 42) | defaultAddress = "localhost:8500"
  constant defaultPrefix (line 43) | defaultPrefix  = "gnmic/config/targets"
  constant defaultWatchTimeout (line 45) | defaultWatchTimeout  = 1 * time.Minute
  constant defaultActionTimeout (line 46) | defaultActionTimeout = 30 * time.Second
  function init (line 51) | func init() {
  type consulLoader (line 62) | type consulLoader struct
    method Init (line 123) | func (c *consulLoader) Init(ctx context.Context, cfg map[string]interf...
    method Start (line 202) | func (c *consulLoader) Start(ctx context.Context) chan *loaders.Target...
    method RunOnce (line 250) | func (c *consulLoader) RunOnce(ctx context.Context) (map[string]*types...
    method initClient (line 306) | func (c *consulLoader) initClient() error {
    method setDefaults (line 331) | func (c *consulLoader) setDefaults() error {
    method startServicesWatch (line 347) | func (c *consulLoader) startServicesWatch(ctx context.Context, service...
    method watch (line 387) | func (c *consulLoader) watch(qOpts *api.QueryOptions, serviceName stri...
    method serviceEntryToTargetConfig (line 403) | func (c *consulLoader) serviceEntryToTargetConfig(se *api.ServiceEntry...
    method updateTargets (line 473) | func (c *consulLoader) updateTargets(ctx context.Context, srvName stri...
    method readVars (line 511) | func (c *consulLoader) readVars(ctx context.Context) error {
    method initializeAction (line 529) | func (c *consulLoader) initializeAction(cfg map[string]interface{}) (a...
    method runActions (line 553) | func (c *consulLoader) runActions(ctx context.Context, tcs map[string]...
    method runOnAddActions (line 634) | func (c *consulLoader) runOnAddActions(ctx context.Context, tName stri...
    method runOnDeleteActions (line 658) | func (c *consulLoader) runOnDeleteActions(ctx context.Context, tName s...
  type cfg (line 79) | type cfg struct
  type serviceDef (line 113) | type serviceDef struct

FILE: pkg/loaders/consul_loader/consul_loader_metrics.go
  function initMetrics (line 34) | func initMetrics() {
  function registerMetrics (line 40) | func registerMetrics(reg *prometheus.Registry) error {

FILE: pkg/loaders/consul_loader/consul_loader_test.go
  function TestIssue706_ServicesWithExtraTagsFiltered (line 24) | func TestIssue706_ServicesWithExtraTagsFiltered(t *testing.T) {
  function TestOldBuggyLogicWouldReject (line 83) | func TestOldBuggyLogicWouldReject(t *testing.T) {

FILE: pkg/loaders/consul_loader/options.go
  method RegisterMetrics (line 17) | func (c *consulLoader) RegisterMetrics(reg *prometheus.Registry) {
  method WithActions (line 30) | func (c *consulLoader) WithActions(acts map[string]map[string]interface{...
  method WithTargetsDefaults (line 34) | func (c *consulLoader) WithTargetsDefaults(fn func(tc *types.TargetConfi...

FILE: pkg/loaders/docker_loader/docker_loader.go
  constant loggingPrefix (line 40) | loggingPrefix = "[docker_loader] "
  constant watchInterval (line 41) | watchInterval = 30 * time.Second
  constant loaderType (line 42) | loaderType    = "docker"
  function init (line 45) | func init() {
  type dockerLoader (line 57) | type dockerLoader struct
    method Init (line 116) | func (d *dockerLoader) Init(ctx context.Context, cfg map[string]interf...
    method setDefaults (line 206) | func (d *dockerLoader) setDefaults() {
    method createDockerClient (line 224) | func (d *dockerLoader) createDockerClient() (*dClient.Client, error) {
    method Start (line 241) | func (d *dockerLoader) Start(ctx context.Context) chan *loaders.Target...
    method RunOnce (line 264) | func (d *dockerLoader) RunOnce(ctx context.Context) (map[string]*types...
    method update (line 277) | func (d *dockerLoader) update(ctx context.Context, opChan chan *loader...
    method getTargets (line 291) | func (d *dockerLoader) getTargets(ctx context.Context) (map[string]*ty...
    method diff (line 467) | func (d *dockerLoader) diff(m map[string]*types.TargetConfig) *loaders...
    method String (line 492) | func (d *dockerLoader) String() string {
    method updateTargets (line 500) | func (d *dockerLoader) updateTargets(ctx context.Context, tcs map[stri...
    method readVars (line 534) | func (d *dockerLoader) readVars(ctx context.Context) error {
    method initializeAction (line 552) | func (d *dockerLoader) initializeAction(cfg map[string]interface{}) (a...
    method runActions (line 576) | func (d *dockerLoader) runActions(ctx context.Context, tcs map[string]...
    method runOnAddActions (line 641) | func (d *dockerLoader) runOnAddActions(ctx context.Context, tName stri...
    method runOnDeleteActions (line 669) | func (d *dockerLoader) runOnDeleteActions(ctx context.Context, tName s...
  type targetFilterComp (line 75) | type targetFilterComp struct
  type cfg (line 82) | type cfg struct
  type targetFilter (line 109) | type targetFilter struct
  function getPortNumber (line 683) | func getPortNumber(labels map[string]string, p string) uint16 {

FILE: pkg/loaders/docker_loader/docker_loader_metrics.go
  function initMetrics (line 48) | func initMetrics() {
  function registerMetrics (line 56) | func registerMetrics(reg *prometheus.Registry) error {

FILE: pkg/loaders/docker_loader/options.go
  method RegisterMetrics (line 16) | func (d *dockerLoader) RegisterMetrics(reg *prometheus.Registry) {
  method WithActions (line 29) | func (d *dockerLoader) WithActions(acts map[string]map[string]interface{...
  method WithTargetsDefaults (line 33) | func (d *dockerLoader) WithTargetsDefaults(fn func(tc *types.TargetConfi...

FILE: pkg/loaders/file_loader/file_loader.go
  constant loggingPrefix (line 35) | loggingPrefix = "[file_loader] "
  constant watchInterval (line 36) | watchInterval = 30 * time.Second
  constant loaderType (line 37) | loaderType    = "file"
  function init (line 40) | func init() {
  type fileLoader (line 55) | type fileLoader struct
    method Init (line 98) | func (f *fileLoader) Init(ctx context.Context, cfg map[string]interfac...
    method String (line 154) | func (f *fileLoader) String() string {
    method Start (line 162) | func (f *fileLoader) Start(ctx context.Context) chan *loaders.TargetOp...
    method RunOnce (line 183) | func (f *fileLoader) RunOnce(ctx context.Context) (map[string]*types.T...
    method update (line 194) | func (f *fileLoader) update(ctx context.Context, opChan chan *loaders....
    method getTargets (line 215) | func (f *fileLoader) getTargets(ctx context.Context) (map[string]*type...
    method updateTargets (line 271) | func (f *fileLoader) updateTargets(ctx context.Context, tcs map[string...
    method readVars (line 307) | func (f *fileLoader) readVars(ctx context.Context) error {
    method initializeAction (line 325) | func (f *fileLoader) initializeAction(cfg map[string]interface{}) (act...
    method runActions (line 349) | func (f *fileLoader) runActions(ctx context.Context, tcs map[string]*t...
    method runOnAddActions (line 414) | func (d *fileLoader) runOnAddActions(ctx context.Context, tName string...
    method runOnDeleteActions (line 442) | func (d *fileLoader) runOnDeleteActions(ctx context.Context, tName str...
  type cfg (line 70) | type cfg struct

FILE: pkg/loaders/file_loader/file_loader_metrics.go
  function initMetrics (line 48) | func initMetrics() {
  function registerMetrics (line 56) | func registerMetrics(reg *prometheus.Registry) error {

FILE: pkg/loaders/file_loader/options.go
  method RegisterMetrics (line 16) | func (f *fileLoader) RegisterMetrics(reg *prometheus.Registry) {
  method WithActions (line 29) | func (f *fileLoader) WithActions(acts map[string]map[string]interface{}) {
  method WithTargetsDefaults (line 33) | func (f *fileLoader) WithTargetsDefaults(fn func(tc *types.TargetConfig)...

FILE: pkg/loaders/http_loader/http_loader.go
  constant loggingPrefix (line 36) | loggingPrefix   = "[http_loader] "
  constant loaderType (line 37) | loaderType      = "http"
  constant defaultInterval (line 38) | defaultInterval = 1 * time.Minute
  constant defaultTimeout (line 39) | defaultTimeout  = 50 * time.Second
  function init (line 42) | func init() {
  type httpLoader (line 53) | type httpLoader struct
    method Init (line 112) | func (h *httpLoader) Init(ctx context.Context, cfg map[string]interfac...
    method Start (line 171) | func (h *httpLoader) Start(ctx context.Context) chan *loaders.TargetOp...
    method RunOnce (line 192) | func (h *httpLoader) RunOnce(ctx context.Context) (map[string]*types.T...
    method update (line 203) | func (h *httpLoader) update(ctx context.Context, opChan chan *loaders....
    method setDefaults (line 217) | func (h *httpLoader) setDefaults() error {
    method getTargets (line 230) | func (h *httpLoader) getTargets() (map[string]*types.TargetConfig, err...
    method updateTargets (line 310) | func (h *httpLoader) updateTargets(ctx context.Context, tcs map[string...
    method readVars (line 347) | func (h *httpLoader) readVars(ctx context.Context) error {
    method initializeAction (line 367) | func (h *httpLoader) initializeAction(cfg map[string]interface{}) (act...
    method runActions (line 391) | func (f *httpLoader) runActions(ctx context.Context, tcs map[string]*t...
    method runOnAddActions (line 443) | func (d *httpLoader) runOnAddActions(ctx context.Context, tName string...
    method runOnDeleteActions (line 471) | func (d *httpLoader) runOnDeleteActions(ctx context.Context, tName str...
  type cfg (line 68) | type cfg struct

FILE: pkg/loaders/http_loader/http_loader_metrics.go
  function initMetrics (line 48) | func initMetrics() {
  function registerMetrics (line 56) | func registerMetrics(reg *prometheus.Registry) error {

FILE: pkg/loaders/http_loader/http_loader_test.go
  type fakeAction (line 34) | type fakeAction struct
    method Init (line 40) | func (f *fakeAction) Init(cfg map[string]interface{}, opts ...actions....
    method Run (line 46) | func (f *fakeAction) Run(ctx context.Context, aCtx *actions.Context) (...
    method NName (line 58) | func (f *fakeAction) NName() string                              { ret...
    method WithTargets (line 59) | func (f *fakeAction) WithTargets(map[string]*types.TargetConfig) {}
    me
Condensed preview — 666 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,924K chars).
[
  {
    "path": ".dockerignore",
    "chars": 12,
    "preview": "tests/\ndocs/"
  },
  {
    "path": ".github/dependabot.yml",
    "chars": 226,
    "preview": "version: 2\nupdates:\n  -   package-ecosystem: \"github-actions\"\n      directory: \"/\"\n      schedule:\n          interval: \""
  },
  {
    "path": ".github/workflows/close_state_issues.yml",
    "chars": 1148,
    "preview": "# © 2024 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".github/workflows/docs.yml",
    "chars": 895,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 1421,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1627,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 1285,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".gitignore",
    "chars": 141,
    "preview": "_test/\ntests/clab-*\ntests/srl-*\ntests/.*clab.yaml\ntests/collector/suite/*/clab-*\nbuilds/\ndist\n*.log\ngnmic\n*.tmp\n*.work*\n"
  },
  {
    "path": ".golangci.yml",
    "chars": 1969,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 3536,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "Dockerfile",
    "chars": 950,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "LICENSE",
    "chars": 11358,
    "preview": "\n                                 Apache License\n                           Version 2.0, January 2004\n                  "
  },
  {
    "path": "README.md",
    "chars": 5743,
    "preview": "<p align=center><img src=docs/images/gnmic-headline.svg?sanitize=true/></p>\n\n[![github release](https://img.shields.io/g"
  },
  {
    "path": "cmd/demo/getresponse.textproto",
    "chars": 4200,
    "preview": "notification: {\n  timestamp: 1676419100456944135\n  prefix: {\n    origin: \"openconfig\"\n    target: \"fakedut\"\n  }\n  update"
  },
  {
    "path": "cmd/demo/setrequest.textproto",
    "chars": 1002,
    "preview": "replace {\n  path {\n    elem {\n      name: \"system\"\n    }\n    elem {\n      name: \"config\"\n    }\n    elem {\n      name: \"h"
  },
  {
    "path": "cmd/demo/setrequest2.textproto",
    "chars": 1000,
    "preview": "replace {\n  path {\n    elem {\n      name: \"system\"\n    }\n    elem {\n      name: \"config\"\n    }\n    elem {\n      name: \"h"
  },
  {
    "path": "cmd/demo/subscriberesponses.textproto",
    "chars": 4160,
    "preview": "sync_response: true\n\nupdate: {\n  timestamp: 1676419100456944135\n  prefix: {\n    origin: \"openconfig\"\n    target: \"fakedu"
  },
  {
    "path": "config.json",
    "chars": 2547,
    "preview": "{\n    \"username\": \"admin\",\n    \"password\": \"sros\",\n    \"port\": 57400,\n    \"timeout\": \"5s\",\n    \"skip-verify\": true,\n    "
  },
  {
    "path": "config.toml",
    "chars": 1314,
    "preview": "username = \"admin\"\npassword = \"sros\"\nport = 57400\ntimeout = \"5s\"\nskip-verify = true\ntls-key = \"/path/to/client.key\"\ntls-"
  },
  {
    "path": "config.yaml",
    "chars": 1880,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "docs/CNAME",
    "chars": 20,
    "preview": "gnmic.openconfig.net"
  },
  {
    "path": "docs/basic_usage.md",
    "chars": 3677,
    "preview": "The following examples demonstrate the basic usage of `gnmic` in a scenario where the remote target runs an unsecured (w"
  },
  {
    "path": "docs/blog/index.md",
    "chars": 11,
    "preview": "Coming soon"
  },
  {
    "path": "docs/changelog.md",
    "chars": 41210,
    "preview": "## Changelog\n\n### v0.45.0 - March 2nd 2026\n\n- Prometheus and Prometheus RemoteWrite outputs:\n\n    - When converting valu"
  },
  {
    "path": "docs/cmd/capabilities.md",
    "chars": 1614,
    "preview": "## Description\n\nThe `[cap | capabilities]` command represents the [gNMI Capabilities RPC](https://github.com/openconfig/"
  },
  {
    "path": "docs/cmd/collector.md",
    "chars": 5497,
    "preview": "### Description\n\nThe `[collect | collector | coll | c]` command starts gNMIc as a long-running telemetry collector servi"
  },
  {
    "path": "docs/cmd/diff/diff.md",
    "chars": 7246,
    "preview": "\n### Description\n\nThe `diff` command is similar to a `get` or `subscribe` (mode ONCE) commands ran against at least 2 ta"
  },
  {
    "path": "docs/cmd/diff/diff_set_to_notifs.md",
    "chars": 2735,
    "preview": "### Description\n\nThe `diff set-to-notifs` command is used to verify whether a set of\nnotifications from a `GetResponse` "
  },
  {
    "path": "docs/cmd/diff/diff_setrequest.md",
    "chars": 2556,
    "preview": "### Description\n\nThe `diff setrequest` command is used to compare the intent between two\n`SetRequest` messages encoded i"
  },
  {
    "path": "docs/cmd/generate/generate_path.md",
    "chars": 104,
    "preview": "\n\n### Description \n\nThe path sub command is an alias for the [`gnmic path`](../../cmd/path.md) command.\n"
  },
  {
    "path": "docs/cmd/generate/generate_set_request.md",
    "chars": 8515,
    "preview": "\n### Description\n\nThe set-request sub command generates a Set request file given a list of update and/or replace paths.\n"
  },
  {
    "path": "docs/cmd/generate.md",
    "chars": 3161,
    "preview": "\n\n### Description\n\nMost `gNMI` targets use YANG as a modeling language for their datastores.\nIt order to access and mani"
  },
  {
    "path": "docs/cmd/get.md",
    "chars": 4025,
    "preview": "### Description\n\nThe `get` command represents the gNMI [Get RPC](https://github.com/openconfig/gnmi/blob/master/proto/gn"
  },
  {
    "path": "docs/cmd/getset.md",
    "chars": 3583,
    "preview": "### Description\n\nThe `getset` command is a combination of the gNMI [Get RPC](https://github.com/openconfig/gnmi/blob/mas"
  },
  {
    "path": "docs/cmd/listen.md",
    "chars": 5060,
    "preview": "### Description\n`gnmic` can be used in a \"dial-out telemetry\" mode by means of the `listen` command. In the dial-out mod"
  },
  {
    "path": "docs/cmd/path.md",
    "chars": 3336,
    "preview": "### Description\n\nWith `path` command it is possible to generate and search through the XPATH style paths extracted from "
  },
  {
    "path": "docs/cmd/processor.md",
    "chars": 10468,
    "preview": "### Description\n\nThe `[processor | proc]` command allows running a set of event processor offline given an input of even"
  },
  {
    "path": "docs/cmd/prompt.md",
    "chars": 2670,
    "preview": "## Description\nThe `prompt` command starts `gnmic` in an interactive prompt mode with the following auto-completion feat"
  },
  {
    "path": "docs/cmd/proxy.md",
    "chars": 6877,
    "preview": "### Description\n\nThe `[proxy]` command start a gNMI proxy server. That relays gNMI messages to know targets (either conf"
  },
  {
    "path": "docs/cmd/set.md",
    "chars": 21128,
    "preview": "## Description\n\nThe `set` command represents the [gNMI Set RPC](https://github.com/openconfig/gnmi/blob/master/proto/gnm"
  },
  {
    "path": "docs/cmd/subscribe.md",
    "chars": 7921,
    "preview": "### Description\n\nThe `[subscribe | sub]` command represents the [gNMI Subscribe RPC](https://github.com/openconfig/gnmi/"
  },
  {
    "path": "docs/deployments/clusters/containerlab/cluster_with_gnmi_server_and_prometheus_output.md",
    "chars": 6827,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ and __data aggregation__ via clusteri"
  },
  {
    "path": "docs/deployments/clusters/containerlab/cluster_with_influxdb_output.md",
    "chars": 5440,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ via clustering.\n\nThis deployment exam"
  },
  {
    "path": "docs/deployments/clusters/containerlab/cluster_with_nats_input_and_prometheus_output.md",
    "chars": 7037,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ as well as __data replication__.\n\nThe"
  },
  {
    "path": "docs/deployments/clusters/containerlab/cluster_with_prometheus_output.md",
    "chars": 5763,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ via clustering.\n\nThis deployment exam"
  },
  {
    "path": "docs/deployments/clusters/docker-compose/cluster_with_influxdb_output.md",
    "chars": 1618,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ via clustering.\n\nThis deployment exam"
  },
  {
    "path": "docs/deployments/clusters/docker-compose/cluster_with_nats_input_and_prometheus_output.md",
    "chars": 3085,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ as well as __data replication__.\n\nThe"
  },
  {
    "path": "docs/deployments/clusters/docker-compose/cluster_with_prometheus_output.md",
    "chars": 1937,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ via clustering.\n\nThis deployment exam"
  },
  {
    "path": "docs/deployments/clusters/kubernetes/cluster_with_prometheus_output.md",
    "chars": 2981,
    "preview": "The purpose of this deployment is to achieve __redundancy__, __high-availability__ using Kubernetes and `gnmic`'s intern"
  },
  {
    "path": "docs/deployments/deployments_intro.md",
    "chars": 3222,
    "preview": "There are numerous ways `gnmic` can be deployed, each fulfilling a specific use case. \n\nWhether it is gNMI telemetry col"
  },
  {
    "path": "docs/deployments/pipelines/docker-compose/forked_pipeline.md",
    "chars": 2748,
    "preview": "\nThe purpose of this deployment is to create a forked data pipeline using `NATS` , `Influxdb` and `Prometheus`\n\nThe exam"
  },
  {
    "path": "docs/deployments/pipelines/docker-compose/gnmic_cluster_nats_prometheus.md",
    "chars": 4053,
    "preview": "\nThe purpose of this deployment is to create a clustered data pipeline using `NATS` and `Prometheus`.\nAchieving __redund"
  },
  {
    "path": "docs/deployments/pipelines/docker-compose/nats_influxdb.md",
    "chars": 2188,
    "preview": "The purpose of this deployment is to create data pipeline using `NATS` and `InfluxDB`\n\nThe example includes 2 `gnmic` in"
  },
  {
    "path": "docs/deployments/pipelines/docker-compose/nats_prometheus.md",
    "chars": 2209,
    "preview": "\nThe purpose of this deployment is to create data pipeline using `NATS` and `Prometheus`\n\nThe example includes 2 `gnmic`"
  },
  {
    "path": "docs/deployments/single-instance/containerlab/influxdb-output.md",
    "chars": 3776,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to an `InfluxDB` instance.\n\nThis deployment example "
  },
  {
    "path": "docs/deployments/single-instance/containerlab/kafka-output.md",
    "chars": 3691,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to a `Kafka` broker.\n\nMultiple 3rd Party systems (ac"
  },
  {
    "path": "docs/deployments/single-instance/containerlab/multiple-outputs.md",
    "chars": 4938,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to multiple outputs.\n\nThis deployment example includ"
  },
  {
    "path": "docs/deployments/single-instance/containerlab/nats-output.md",
    "chars": 3397,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to a `NATS` server.\n\nMultiple 3rd Party systems (act"
  },
  {
    "path": "docs/deployments/single-instance/containerlab/prometheus-output.md",
    "chars": 4265,
    "preview": "The purpose of this deployment is to collect gNMI data and make it available for scraping by a `Prometheus` client.\n\nThi"
  },
  {
    "path": "docs/deployments/single-instance/containerlab/prometheus-remote-write-output.md",
    "chars": 4247,
    "preview": "The purpose of this deployment is to collect gNMI data and use [Prometheus remote write API](https://grafana.com/blog/20"
  },
  {
    "path": "docs/deployments/single-instance/docker-compose/influxdb-output.md",
    "chars": 1486,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to an `InfluxDB` instance.\n\nThis deployment example "
  },
  {
    "path": "docs/deployments/single-instance/docker-compose/kafka-output.md",
    "chars": 1585,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to a `Kafka` broker.\n\nMultiple 3rd Party systems (ac"
  },
  {
    "path": "docs/deployments/single-instance/docker-compose/multiple-outputs.md",
    "chars": 1922,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to multiple outputs.\n\nThis deployment example includ"
  },
  {
    "path": "docs/deployments/single-instance/docker-compose/nats-output.md",
    "chars": 1573,
    "preview": "The purpose of this deployment is to collect gNMI data and write it to a `NATS` server.\n\nMultiple 3rd Party systems (act"
  },
  {
    "path": "docs/deployments/single-instance/docker-compose/prometheus-output.md",
    "chars": 1694,
    "preview": "The purpose of this deployment is to collect gNMI data and make it available for scraping by a `Prometheus` client.\n\nThi"
  },
  {
    "path": "docs/global_flags.md",
    "chars": 11523,
    "preview": "### address\n\nThe address flag `[-a | --address]` is used to specify the target's gNMI server address in address:port for"
  },
  {
    "path": "docs/index.md",
    "chars": 4528,
    "preview": "<nbsp/>\n<p style=\"text-align:center;\"><img src=https://raw.githubusercontent.com/openconfig/gnmic/main/docs/images/gnmic"
  },
  {
    "path": "docs/install.md",
    "chars": 2801,
    "preview": "`gnmic` is a single binary built for the Linux, Mac OS and Windows operating systems distributed via [Github releases](h"
  },
  {
    "path": "docs/stylesheets/extra.css",
    "chars": 56,
    "preview": ".md-typeset code {\n    background-color: transparent ;\n}"
  },
  {
    "path": "docs/user_guide/HA.md",
    "chars": 10007,
    "preview": "\nMultiple instances of`gnmic` can be run in clustered mode in order to load share the targets connections and protect ag"
  },
  {
    "path": "docs/user_guide/actions/actions.md",
    "chars": 11505,
    "preview": "# Actions\n\n`gNMIc` supports running actions as result of an event, possible triggering events are:\n\n- A gNMI SubscribeRe"
  },
  {
    "path": "docs/user_guide/api/api_intro.md",
    "chars": 2666,
    "preview": "A limited set of REST endpoints are supported, these are mainly used to allow for a clustered deployment for multiple `g"
  },
  {
    "path": "docs/user_guide/api/cluster.md",
    "chars": 10083,
    "preview": "# Cluster\n\n## /api/v1/cluster\n\n### `GET /api/v1/cluster`\n\nRequest gNMIc cluster state and details.\n\n=== \"Request\"\n    ``"
  },
  {
    "path": "docs/user_guide/api/configuration.md",
    "chars": 7692,
    "preview": "\n# Configuration\n\n## /api/v1/config\n\n### `GET /api/v1/config`\n\nRequest all gnmic configuration\n\nReturns the whole config"
  },
  {
    "path": "docs/user_guide/api/other.md",
    "chars": 481,
    "preview": "# Other\n\n## /api/v1/healthz\n\n### `GET /api/v1/healthz`\n\nHealth check endpoint for Kubernetes or similar\n\n=== \"Request\"\n "
  },
  {
    "path": "docs/user_guide/api/targets.md",
    "chars": 4462,
    "preview": "## `GET /api/v1/targets`\n\nRequest all active targets details.\n\nReturns all active targets as json\n\n=== \"Request\"\n    ```"
  },
  {
    "path": "docs/user_guide/caching.md",
    "chars": 8718,
    "preview": "\n`Caching` refers to the process of storing the collected gNMI updates before sending them out to the intended output(s)"
  },
  {
    "path": "docs/user_guide/collector/collector_api.md",
    "chars": 10396,
    "preview": "# Collector REST API\n\nThe collector exposes a REST API for dynamic configuration management and status queries. This API"
  },
  {
    "path": "docs/user_guide/collector/collector_configuration.md",
    "chars": 8121,
    "preview": "# Collector Configuration\n\nThis page describes the configuration options specific to the collector mode. For general con"
  },
  {
    "path": "docs/user_guide/collector/collector_intro.md",
    "chars": 2143,
    "preview": "# Collector Mode\n\n## Introduction\n\nThe Collector mode (`gnmic collect --config <file_name>`) is ideal for a long-running"
  },
  {
    "path": "docs/user_guide/configuration_env.md",
    "chars": 2668,
    "preview": "`gnmic` can be configured using environment variables, it will read the environment variables starting with `GNMIC_`.\n\nT"
  },
  {
    "path": "docs/user_guide/configuration_file.md",
    "chars": 3888,
    "preview": "`gnmic` configuration by means of the command line flags is both consistent and reliable. But sometimes its not the best"
  },
  {
    "path": "docs/user_guide/configuration_flags.md",
    "chars": 419,
    "preview": "`gnmic` supports a set of global flags, applicable to all sub commands, as well as local flags which are specific to eac"
  },
  {
    "path": "docs/user_guide/configuration_intro.md",
    "chars": 1993,
    "preview": "`gnmic` reads configuration from three different sources,\n[Global and local flags](configuration_flags.md), [environment"
  },
  {
    "path": "docs/user_guide/event_processors/event_add_tag.md",
    "chars": 2679,
    "preview": "The `event-add-tag` processor adds a set of tags to an event message if one of the configured regular expressions in the"
  },
  {
    "path": "docs/user_guide/event_processors/event_allow.md",
    "chars": 5069,
    "preview": "The `event-allow` processor allows only messages matching the configured `condition` or one of the regular expressions u"
  },
  {
    "path": "docs/user_guide/event_processors/event_combine.md",
    "chars": 3512,
    "preview": "The `event-combine` processor combines multiple processors together. \nThis allows to declare processors once and reuse t"
  },
  {
    "path": "docs/user_guide/event_processors/event_convert.md",
    "chars": 1155,
    "preview": "The `event-convert` processor converts the values matching one of the regular expressions to a specific type: `uint`, `i"
  },
  {
    "path": "docs/user_guide/event_processors/event_data_convert.md",
    "chars": 4418,
    "preview": "The `event-data-convert` processor converts data values matching one of the regular expressions from/to a specific data "
  },
  {
    "path": "docs/user_guide/event_processors/event_date_string.md",
    "chars": 624,
    "preview": "The `event-date-string` processor converts a specific timestamp value (under tags or values) to a string representation."
  },
  {
    "path": "docs/user_guide/event_processors/event_delete.md",
    "chars": 2602,
    "preview": "The `event-delete` processor deletes all tags or values matching a set of regular expressions from the event message.\n\n#"
  },
  {
    "path": "docs/user_guide/event_processors/event_drop.md",
    "chars": 2380,
    "preview": "The `event-drop` processor drops the whole message if it matches the configured `condition` or one of the regexes under`"
  },
  {
    "path": "docs/user_guide/event_processors/event_duration_convert.md",
    "chars": 1489,
    "preview": "The `event-duration-convert` processor converts duration written as string to a integer with second precision.\n\nThe stri"
  },
  {
    "path": "docs/user_guide/event_processors/event_extract_tags.md",
    "chars": 3769,
    "preview": "The `event-extract-tags` processor extracts tags from a value, a value name, a tag name or a tag value using regex named"
  },
  {
    "path": "docs/user_guide/event_processors/event_group_by.md",
    "chars": 4796,
    "preview": "The `event-group-by` processor groups values under the same event message based on a list of tag names.\n\nThis processor "
  },
  {
    "path": "docs/user_guide/event_processors/event_ieeefloat32.md",
    "chars": 1288,
    "preview": "The `event-ieeefloat32` processor allows converting binary data received from a router with the type IEEE 32-bit floatin"
  },
  {
    "path": "docs/user_guide/event_processors/event_jq.md",
    "chars": 1838,
    "preview": "The `event-jq` processor applies a [`jq`](https://stedolan.github.io/jq/) expression on the received event messages.\n\n`j"
  },
  {
    "path": "docs/user_guide/event_processors/event_merge.md",
    "chars": 3291,
    "preview": "The `event-merge` processor merges multiple event messages together based on some criteria.\n\nEach [gNMI subscribe Respon"
  },
  {
    "path": "docs/user_guide/event_processors/event_override_ts.md",
    "chars": 354,
    "preview": "The `event-override-ts` processor overrides the message timestamp with `time.Now()`. The precision `s`, `ms`, `us` or `n"
  },
  {
    "path": "docs/user_guide/event_processors/event_plugin.md",
    "chars": 3745,
    "preview": "The `event-plugin` processor initializes a processor that gNMIc loaded from the configured path under the `plugins:` sec"
  },
  {
    "path": "docs/user_guide/event_processors/event_rate_limit.md",
    "chars": 1072,
    "preview": "The `event-rate-limit` processor rate-limits each event with matching tags to the configured amount per-seconds.\n\nAll th"
  },
  {
    "path": "docs/user_guide/event_processors/event_starlark.md",
    "chars": 11953,
    "preview": "### Intro\n\nThe `event-starlark` processor applies a [`Starlark`](https://github.com/google/starlark-go/blob/master/doc/s"
  },
  {
    "path": "docs/user_guide/event_processors/event_strings.md",
    "chars": 16199,
    "preview": "The `event-strings` processor exposes a few of Golang strings transformation functions, there functions can be applied t"
  },
  {
    "path": "docs/user_guide/event_processors/event_time_epoch.md",
    "chars": 1983,
    "preview": "The event-time-epoch processor is a plugin for gNMIc that converts string-based time values in event messages into epoch"
  },
  {
    "path": "docs/user_guide/event_processors/event_to_tag.md",
    "chars": 1728,
    "preview": "The `event-to-tag` processor moves a value matching one of the regular expressions from the values section to the tags s"
  },
  {
    "path": "docs/user_guide/event_processors/event_trigger.md",
    "chars": 8165,
    "preview": "\nThe `event-trigger` processor takes event messages as input and triggers a list of actions (sequentially) if a configur"
  },
  {
    "path": "docs/user_guide/event_processors/event_value_tag.md",
    "chars": 5868,
    "preview": "The `event-value-tag` processor applies specific values from event messages to tags of other messages, if event tag name"
  },
  {
    "path": "docs/user_guide/event_processors/event_write.md",
    "chars": 3616,
    "preview": "The `event-write` processor writes a message that has a value or a tag matching one of the configured regular expression"
  },
  {
    "path": "docs/user_guide/event_processors/intro.md",
    "chars": 6566,
    "preview": "\nThe event processors provide an easy way to configure a set of functions in order to transform an event message that wi"
  },
  {
    "path": "docs/user_guide/gnmi_server.md",
    "chars": 19071,
    "preview": "# gNMI Server\n\n## Introduction\n\nOn top of acting as `gNMI` client `gNMIc` can run a `gNMI` server that supports `Get`, `"
  },
  {
    "path": "docs/user_guide/golang_package/examples/capabilities.md",
    "chars": 966,
    "preview": "\nThe below snippet shows how to create a target, send a Capabilities Request and print the response.\n\n```golang\npackage "
  },
  {
    "path": "docs/user_guide/golang_package/examples/get.md",
    "chars": 1182,
    "preview": "\nThe below snippet shows how to create a target, send a Get Request and print the response.\n\n```golang\npackage main\n\nimp"
  },
  {
    "path": "docs/user_guide/golang_package/examples/set.md",
    "chars": 1208,
    "preview": "\nThe below snippet shows how to create a target, send a Set Request and print the reponse.\n\n```golang\npackage main\n\nimpo"
  },
  {
    "path": "docs/user_guide/golang_package/examples/subscribe.md",
    "chars": 1863,
    "preview": "\nThe below snippet shows how to create a target and a Subscribe Request.\nIt then starts a Stream subscription with 10s i"
  },
  {
    "path": "docs/user_guide/golang_package/gnmi_options.md",
    "chars": 10760,
    "preview": "\nThe package `github.com/openconfig/gnmic/pkg/api` exposes a set of `api.GNMIOption` that can be used with \n`api.NewGetR"
  },
  {
    "path": "docs/user_guide/golang_package/intro.md",
    "chars": 6554,
    "preview": "`gnmic` (`github.com/openconfig/gnmic/pkg/api`) can be imported as a dependency in your Golang programs.\n\nIt acts as a w"
  },
  {
    "path": "docs/user_guide/golang_package/target_options.md",
    "chars": 1926,
    "preview": "\nThe package `github.com/openconfig/gnmic/pkg/api` exposes a set of `api.TargetOption` that can be used with \n`api.NewTa"
  },
  {
    "path": "docs/user_guide/inputs/input_intro.md",
    "chars": 3751,
    "preview": "`gnmic` supports various Inputs to consume gnmi data, transform it and ultimately export it to one or multiple Outputs.\n"
  },
  {
    "path": "docs/user_guide/inputs/jetstream_input.md",
    "chars": 5257,
    "preview": "When using jetstream as an input, `gnmic` consumes data from a specified NATS JetStream stream using a durable consumer."
  },
  {
    "path": "docs/user_guide/inputs/kafka_input.md",
    "chars": 2825,
    "preview": "When using Kafka as input, `gnmic` consumes data from a specific Kafka topic in `event` or `proto` format.\n\nMultiple con"
  },
  {
    "path": "docs/user_guide/inputs/nats_input.md",
    "chars": 2153,
    "preview": "When using NATS as input, `gnmic` consumes data from a specific NATS subject in `event` or `proto` format.\n\nMultiple con"
  },
  {
    "path": "docs/user_guide/inputs/stan_input.md",
    "chars": 2264,
    "preview": "When using STAN as input, `gnmic` consumes data from a specific STAN subject in `event` or `proto` format.\n\nMultiple con"
  },
  {
    "path": "docs/user_guide/outputs/asciigraph_output.md",
    "chars": 4438,
    "preview": "`gnmic` supports displaying collected metrics as an ASCII graph on the terminal.\nThe graph is generated using the [ascii"
  },
  {
    "path": "docs/user_guide/outputs/file_output.md",
    "chars": 3441,
    "preview": "`gnmic` supports exporting subscription updates to multiple local files\n\nA file output can be defined using the below fo"
  },
  {
    "path": "docs/user_guide/outputs/gnmi_output.md",
    "chars": 9176,
    "preview": "`gnmic` supports acting as a `gNMI Server` to expose the subscribed telemetry data to a `gNMI Client` using the `Subcrib"
  },
  {
    "path": "docs/user_guide/outputs/influxdb_output.md",
    "chars": 5698,
    "preview": "`gnmic` supports exporting subscription updates to [influxDB](https://www.influxdata.com/products/influxdb-overview/) ti"
  },
  {
    "path": "docs/user_guide/outputs/jetstream_output.md",
    "chars": 11486,
    "preview": "`gnmic` supports exporting subscription updates [NATS Jetstream](https://docs.nats.io/nats-concepts/jetstream) servers.\n"
  },
  {
    "path": "docs/user_guide/outputs/kafka_output.md",
    "chars": 9815,
    "preview": "`gnmic` supports exporting subscription updates to multiple Apache Kafka brokers/clusters simultaneously\n\n### Configurat"
  },
  {
    "path": "docs/user_guide/outputs/nats_output.md",
    "chars": 5478,
    "preview": "`gnmic` supports exporting subscription updates to multiple NATS servers/clusters simultaneously\n\nA [NATS](https://docs."
  },
  {
    "path": "docs/user_guide/outputs/otlp_output.md",
    "chars": 7360,
    "preview": "`gnmic` supports exporting subscription updates as [OpenTelemetry](https://opentelemetry.io/) metrics using the [OTLP](h"
  },
  {
    "path": "docs/user_guide/outputs/output_intro.md",
    "chars": 6666,
    "preview": "In the context of gnmi subscriptions (on top of terminal output) `gnmic` supports multiple output options:\n\n* [Local fil"
  },
  {
    "path": "docs/user_guide/outputs/prometheus_output.md",
    "chars": 20872,
    "preview": "## Introduction\n\ngNMIc offers the capability to present gNMI updates on a Prometheus server, allowing a Prometheus syste"
  },
  {
    "path": "docs/user_guide/outputs/prometheus_write_output.md",
    "chars": 7572,
    "preview": "`gnmic` supports writing metrics to Prometheus using its [remote write API](https://grafana.com/blog/2019/03/25/whats-ne"
  },
  {
    "path": "docs/user_guide/outputs/snmp_output.md",
    "chars": 6784,
    "preview": "`gnmic` supports generating SNMP traps based on received gNMI updates.\n\nThis output type is useful when trying to integr"
  },
  {
    "path": "docs/user_guide/outputs/stan_output.md",
    "chars": 3196,
    "preview": "`gnmic` supports exporting subscription updates to multiple NATS Streaming (STAN) servers/clusters simultaneously\n\nA STA"
  },
  {
    "path": "docs/user_guide/outputs/tcp_output.md",
    "chars": 2487,
    "preview": "`gnmic` supports exporting subscription updates to a TCP server\n\nA TCP output can be defined using the below format in `"
  },
  {
    "path": "docs/user_guide/outputs/udp_output.md",
    "chars": 2285,
    "preview": "`gnmic` supports exporting subscription updates to a UDP server\n\nA UDP output can be defined using the below format in `"
  },
  {
    "path": "docs/user_guide/prompt_suggestions.md",
    "chars": 13838,
    "preview": "Starting with `gnmic v0.4.0` release the users can enjoy the interactive prompt mode which can be enabled with the [`pro"
  },
  {
    "path": "docs/user_guide/subscriptions.md",
    "chars": 15382,
    "preview": "\nDefining subscriptions with [`subscribe`](../cmd/subscribe.md) command's CLI flags is a quick&easy way to work with gNM"
  },
  {
    "path": "docs/user_guide/targets/target_discovery/consul_discovery.md",
    "chars": 3440,
    "preview": "The Consul target loader discovers gNMI targets registered as service instances in a Consul Server.\n\nThe loader watches "
  },
  {
    "path": "docs/user_guide/targets/target_discovery/discovery_intro.md",
    "chars": 6806,
    "preview": "## Introduction\n\n`gnmic` supports dynamic loading of gNMI targets from external systems.\nThis feature allows adding and "
  },
  {
    "path": "docs/user_guide/targets/target_discovery/docker_discovery.md",
    "chars": 7428,
    "preview": "\nThe Docker target loader allows discovering gNMI targets from [Docker Engine](https://docs.docker.com/engine/) hosts.\n\n"
  },
  {
    "path": "docs/user_guide/targets/target_discovery/file_discovery.md",
    "chars": 4676,
    "preview": "\n`gnmic` is able to watch changes happening to a file that contains the gNMI targets configuration.\n\nThe file can be loc"
  },
  {
    "path": "docs/user_guide/targets/target_discovery/http_discovery.md",
    "chars": 3006,
    "preview": "\nThe HTTP target loader can be used to query targets configurations from a remote HTTP server.\n\nIt expects a well format"
  },
  {
    "path": "docs/user_guide/targets/targets.md",
    "chars": 19803,
    "preview": "# Targets\n\nSometimes it is needed to perform an operation on multiple devices; be it getting the same leaf value from a "
  },
  {
    "path": "docs/user_guide/targets/targets_session_sec.md",
    "chars": 9388,
    "preview": "# Targets session security\n\nIn line with the guidelines detailed in the [gNMI Specification](https://github.com/openconf"
  },
  {
    "path": "docs/user_guide/tunnel_server.md",
    "chars": 7657,
    "preview": "# Tunnel Server\n\n## Introduction\n\n`gNMIc` supports gNMI Dial-out as defined by [`openconfig/grpctunnel`](https://github."
  },
  {
    "path": "examples/deployments/1.single-instance/1.nats-output/containerlab/gnmic.yaml",
    "chars": 916,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/1.nats-output/containerlab/nats.clab.yaml",
    "chars": 1393,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/1.nats-output/docker-compose/docker-compose.yaml",
    "chars": 927,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/1.nats-output/docker-compose/gnmic1.yaml",
    "chars": 951,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/10.prometheus-with-cache/containerlab/gnmic.yaml",
    "chars": 2142,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/10.prometheus-with-cache/containerlab/grafana/datasources/datasource.yaml",
    "chars": 796,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/10.prometheus-with-cache/containerlab/prometheus/prometheus.yaml",
    "chars": 940,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/10.prometheus-with-cache/containerlab/prometheus.clab.yaml",
    "chars": 2393,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/11.kafka-kraft-output/containerlab/gnmic.yaml",
    "chars": 947,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/11.kafka-kraft-output/containerlab/kafka.clab.yaml",
    "chars": 1954,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/2.kafka-output/containerlab/gnmic.yaml",
    "chars": 947,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/2.kafka-output/containerlab/kafka.clab.yaml",
    "chars": 1807,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/2.kafka-output/docker-compose/docker-compose.yaml",
    "chars": 1383,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/2.kafka-output/docker-compose/gnmic1.yaml",
    "chars": 959,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/3.influxdb-output/containerlab/gnmic.yaml",
    "chars": 1023,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/3.influxdb-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 688,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/3.influxdb-output/containerlab/influxdb.clab.yaml",
    "chars": 1869,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/3.influxdb-output/docker-compose/docker-compose.yaml",
    "chars": 1194,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/3.influxdb-output/docker-compose/gnmic1.yaml",
    "chars": 1021,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/containerlab/gnmic.yaml",
    "chars": 1206,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 795,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/containerlab/prometheus/prometheus.yaml",
    "chars": 689,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/containerlab/prometheus.clab.yaml",
    "chars": 2245,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/docker-compose/docker-compose.yaml",
    "chars": 1571,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/docker-compose/gnmic1.yaml",
    "chars": 959,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/4.prometheus-output/docker-compose/prometheus/prometheus.yaml",
    "chars": 677,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/containerlab/gnmic.yaml",
    "chars": 1415,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/containerlab/grafana/datasources/datasource.yaml",
    "chars": 998,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/containerlab/multiple-outputs.clab.yaml",
    "chars": 3150,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/containerlab/prometheus/prometheus.yaml",
    "chars": 688,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/docker-compose/docker-compose.yaml",
    "chars": 2785,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/docker-compose/gnmic1.yaml",
    "chars": 1377,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/5.multiple-outputs/docker-compose/prometheus/prometheus.yaml",
    "chars": 677,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/6.prometheus-write-output/containerlab/gnmic.yaml",
    "chars": 1077,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/6.prometheus-write-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 795,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/6.prometheus-write-output/containerlab/prometheus/prometheus.yaml",
    "chars": 503,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/6.prometheus-write-output/containerlab/prometheus.clab.yaml",
    "chars": 2311,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/7.cortex-output/containerlab/cortex/single-process-config-blocks.yaml",
    "chars": 2969,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/7.cortex-output/containerlab/cortexmetrics.clab.yaml",
    "chars": 1926,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/7.cortex-output/containerlab/gnmic.yaml",
    "chars": 1025,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/7.cortex-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 794,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/8.victoria-metrics-output/containerlab/gnmic.yaml",
    "chars": 1028,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/8.victoria-metrics-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 789,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/8.victoria-metrics-output/containerlab/victoriametrics.clab.yaml",
    "chars": 1752,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/9.jetstream-output/containerlab/gnmic.yaml",
    "chars": 1048,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/1.single-instance/9.jetstream-output/containerlab/jetstream.clab.yaml",
    "chars": 1468,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/1.influxdb-output/containerlab/gnmic.yaml",
    "chars": 1168,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/1.influxdb-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 688,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/1.influxdb-output/containerlab/lab21.clab.yaml",
    "chars": 4131,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/1.influxdb-output/docker-compose/docker-compose.yaml",
    "chars": 2067,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/1.influxdb-output/docker-compose/gnmic.yaml",
    "chars": 1164,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/2.prometheus-output/containerlab/gnmic.yaml",
    "chars": 1113,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  },
  {
    "path": "examples/deployments/2.clusters/2.prometheus-output/containerlab/grafana/datasources/datasource.yaml",
    "chars": 795,
    "preview": "# © 2022 Nokia.\n#\n# This code is a Contribution to the gNMIc project (“Work”) made under the Google Software Grant and C"
  }
]

// ... and 466 more files (download for full content)

About this extraction

This page contains the full source code of the openconfig/gnmic GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 666 files (3.4 MB), approximately 918.8k tokens, and a symbol index with 2842 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!