Compare commits
	
		
			No commits in common. "master" and "v2.13.0" have entirely different histories.
		
	
	
		| 
						 | 
				
			
			@ -18,10 +18,10 @@ jobs:
 | 
			
		|||
        os: [ubuntu-latest, macos-latest, windows-latest]
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v5
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
 | 
			
		||||
      - name: Set up Go
 | 
			
		||||
        uses: actions/setup-go@v6
 | 
			
		||||
        uses: actions/setup-go@v5
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: ${{ matrix.go }}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -38,14 +38,14 @@ jobs:
 | 
			
		|||
    name: lint
 | 
			
		||||
    runs-on: ${{ matrix.os }}
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v5
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
      - name: Set up Go
 | 
			
		||||
        uses: actions/setup-go@v6
 | 
			
		||||
        uses: actions/setup-go@v5
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: ${{ matrix.go }}
 | 
			
		||||
          cache: false
 | 
			
		||||
      - name: golangci-lint
 | 
			
		||||
        uses: golangci/golangci-lint-action@v7
 | 
			
		||||
        uses: golangci/golangci-lint-action@v6
 | 
			
		||||
        with:
 | 
			
		||||
          # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
 | 
			
		||||
          version: v2.0
 | 
			
		||||
          version: v1.62
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ jobs:
 | 
			
		|||
      DOCKER_REGISTRY: "ghcr.io"
 | 
			
		||||
      DOCKER_IMAGE_NAME: "unpoller/unpoller"
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/checkout@v5
 | 
			
		||||
      - uses: actions/checkout@v4
 | 
			
		||||
        with:
 | 
			
		||||
          fetch-depth: 0
 | 
			
		||||
      - run: git fetch --force --tags
 | 
			
		||||
| 
						 | 
				
			
			@ -31,13 +31,13 @@ jobs:
 | 
			
		|||
        id: buildx
 | 
			
		||||
        uses: docker/setup-buildx-action@v3
 | 
			
		||||
      - name: Login to GitHub Container Registry
 | 
			
		||||
        uses: docker/login-action@v3.6.0
 | 
			
		||||
        uses: docker/login-action@v3.3.0
 | 
			
		||||
        with:
 | 
			
		||||
          registry: ghcr.io
 | 
			
		||||
          username: ${{ github.actor }}
 | 
			
		||||
          password: ${{ secrets.GITHUB_TOKEN }}
 | 
			
		||||
      - name: Login to Docker Hub
 | 
			
		||||
        uses: docker/login-action@v3.6.0
 | 
			
		||||
        uses: docker/login-action@v3.3.0
 | 
			
		||||
        with:
 | 
			
		||||
          username: ${{ secrets.DOCKER_USERNAME }}
 | 
			
		||||
          password: ${{ secrets.DOCKER_PASSWORD }}
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@ jobs:
 | 
			
		|||
          bundler-cache: true # runs 'bundle install' and caches installed gems automatically
 | 
			
		||||
      - name: "Install packagecloud gem"
 | 
			
		||||
        run: gem install package_cloud
 | 
			
		||||
      - uses: actions/setup-go@v6
 | 
			
		||||
      - uses: actions/setup-go@v5
 | 
			
		||||
        with:
 | 
			
		||||
          go-version: 'stable'
 | 
			
		||||
          cache: true
 | 
			
		||||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ jobs:
 | 
			
		|||
          GPG_SIGNING_KEY: /tmp/key.gpg
 | 
			
		||||
          GPG_SIGNING_KEY_ID: ${{ steps.import_gpg.outputs.keyid }}
 | 
			
		||||
      - name: Update Docker Hub Description
 | 
			
		||||
        uses: peter-evans/dockerhub-description@v5
 | 
			
		||||
        uses: peter-evans/dockerhub-description@v4
 | 
			
		||||
        with:
 | 
			
		||||
          username: ${{ secrets.DOCKER_USERNAME }}
 | 
			
		||||
          password: ${{ secrets.DOCKER_PASSWORD }}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ jobs:
 | 
			
		|||
  stale:
 | 
			
		||||
    runs-on: ubuntu-latest
 | 
			
		||||
    steps:
 | 
			
		||||
      - uses: actions/stale@v10
 | 
			
		||||
      - uses: actions/stale@v9
 | 
			
		||||
        with:
 | 
			
		||||
          stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
 | 
			
		||||
          stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 7 days.'
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,30 +1,27 @@
 | 
			
		|||
version: "2"
 | 
			
		||||
run:
 | 
			
		||||
  timeout: 3m
 | 
			
		||||
 | 
			
		||||
linters:
 | 
			
		||||
  enable:
 | 
			
		||||
    - nlreturn
 | 
			
		||||
    - revive
 | 
			
		||||
    - tagalign
 | 
			
		||||
    - testpackage
 | 
			
		||||
    - wsl
 | 
			
		||||
  exclusions:
 | 
			
		||||
    generated: lax
 | 
			
		||||
    presets:
 | 
			
		||||
      - comments
 | 
			
		||||
      - common-false-positives
 | 
			
		||||
      - legacy
 | 
			
		||||
      - std-error-handling
 | 
			
		||||
    paths:
 | 
			
		||||
      - third_party$
 | 
			
		||||
      - builtin$
 | 
			
		||||
      - examples$
 | 
			
		||||
    - nlreturn
 | 
			
		||||
    - tagalign
 | 
			
		||||
    - revive
 | 
			
		||||
    - testpackage
 | 
			
		||||
    - errcheck
 | 
			
		||||
    - gosimple
 | 
			
		||||
    - govet
 | 
			
		||||
    - ineffassign
 | 
			
		||||
    - staticcheck
 | 
			
		||||
    - unused
 | 
			
		||||
 | 
			
		||||
output:
 | 
			
		||||
  sort-results: true
 | 
			
		||||
 | 
			
		||||
issues:
 | 
			
		||||
  max-issues-per-linter: 0
 | 
			
		||||
  # disable the default limit so we see everything
 | 
			
		||||
  max-same-issues: 0
 | 
			
		||||
  max-issues-per-linter: 0
 | 
			
		||||
  
 | 
			
		||||
  # default enable fix where the linter supports
 | 
			
		||||
  fix: true
 | 
			
		||||
formatters:
 | 
			
		||||
  exclusions:
 | 
			
		||||
    generated: lax
 | 
			
		||||
    paths:
 | 
			
		||||
      - third_party$
 | 
			
		||||
      - builtin$
 | 
			
		||||
      - examples$
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -538,10 +538,10 @@ brews:
 | 
			
		|||
      - unifi-poller
 | 
			
		||||
    license: MIT
 | 
			
		||||
    service: |
 | 
			
		||||
      run ["#{opt_bin}/unpoller", "--config", "#{etc}/unpoller/up.conf"]
 | 
			
		||||
      run [opt_bin/"unpoller", "--config", etc/"unpoller/up.conf"]
 | 
			
		||||
      keep_alive true
 | 
			
		||||
      log_path "#{var}/log/unpoller.log"
 | 
			
		||||
      error_log_path "#{var}/log/unpoller.log"
 | 
			
		||||
      log_path var/"log/unpoller.log"
 | 
			
		||||
      error_log_path var/"log/unpoller.log"
 | 
			
		||||
    url_template: "https://github.com/unpoller/unpoller/releases/download/{{ .Tag }}/{{ .ArtifactName }}"
 | 
			
		||||
    test: |
 | 
			
		||||
      assert_match "unpoller v#{version}", shell_output("#{bin}/unpoller -v 2>&1", 2)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -143,18 +143,11 @@
 | 
			
		|||
  # ex: file:///etc/unifi/passwd.file, windows: file://C:\\UserData\\Unifi\\Passwd.txt
 | 
			
		||||
  pass = "unifipoller"
 | 
			
		||||
 | 
			
		||||
  # API Key
 | 
			
		||||
  # Unifi now supports API Key authentication. This is exclusive of user/pass auth.
 | 
			
		||||
  # api_key = "unifiapikey"
 | 
			
		||||
 | 
			
		||||
  # If the controller has more than one site, specify which sites to poll here.
 | 
			
		||||
  # Set this to ["default"] to poll only the first site on the controller.
 | 
			
		||||
  # A setting of ["all"] will poll all sites; this works if you only have 1 site too.
 | 
			
		||||
  sites = ["all"]
 | 
			
		||||
 | 
			
		||||
  # Added an example for overriding the default site name.
 | 
			
		||||
  # default_site_name_override = "My Custom Default Site"
 | 
			
		||||
 | 
			
		||||
  # Specify a timeout, leave missing to declare infinite wait. This determines the maximum
 | 
			
		||||
  # time to wait for a response from the unifi controller on any API request.
 | 
			
		||||
  # timeout = 60s
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,7 +42,7 @@
 | 
			
		|||
    "tags": [
 | 
			
		||||
      "customer:abcde"
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  "unifi": {
 | 
			
		||||
    "dynamic": false,
 | 
			
		||||
| 
						 | 
				
			
			@ -59,8 +59,7 @@
 | 
			
		|||
      "save_dpi":    false,
 | 
			
		||||
      "save_sites":  true,
 | 
			
		||||
      "hash_pii":    false,
 | 
			
		||||
      "verify_ssl":  false,
 | 
			
		||||
      "default_site_name_override": "My Custom Default Site"
 | 
			
		||||
      "verify_ssl":  false
 | 
			
		||||
    },
 | 
			
		||||
    "controllers": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,8 +60,7 @@ unifi:
 | 
			
		|||
    save_sites:  true
 | 
			
		||||
    hash_pii:    false
 | 
			
		||||
    verify_ssl:  false
 | 
			
		||||
    # Added an example for overriding the default site name.
 | 
			
		||||
    # default_site_name_override: "My Custom Default Site"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  controllers:
 | 
			
		||||
   # Repeat the following stanza to poll multiple controllers.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										39
									
								
								go.mod
								
								
								
								
							
							
						
						
									
										39
									
								
								go.mod
								
								
								
								
							| 
						 | 
				
			
			@ -1,33 +1,31 @@
 | 
			
		|||
module github.com/unpoller/unpoller
 | 
			
		||||
 | 
			
		||||
go 1.24.0
 | 
			
		||||
go 1.23
 | 
			
		||||
 | 
			
		||||
toolchain go1.24.2
 | 
			
		||||
toolchain go1.23.4
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/DataDog/datadog-go/v5 v5.7.0
 | 
			
		||||
	github.com/DataDog/datadog-go/v5 v5.6.0
 | 
			
		||||
	github.com/gorilla/mux v1.8.1
 | 
			
		||||
	github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c
 | 
			
		||||
	github.com/pkg/errors v0.9.1
 | 
			
		||||
	github.com/prometheus/client_golang v1.23.2
 | 
			
		||||
	github.com/prometheus/common v0.66.1
 | 
			
		||||
	github.com/spf13/pflag v1.0.10
 | 
			
		||||
	github.com/stretchr/testify v1.11.1
 | 
			
		||||
	github.com/unpoller/unifi/v5 v5.1.1
 | 
			
		||||
	golang.org/x/crypto v0.42.0
 | 
			
		||||
	golang.org/x/net v0.44.0
 | 
			
		||||
	golang.org/x/term v0.35.0
 | 
			
		||||
	github.com/prometheus/client_golang v1.20.5
 | 
			
		||||
	github.com/prometheus/common v0.61.0
 | 
			
		||||
	github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c
 | 
			
		||||
	github.com/stretchr/testify v1.10.0
 | 
			
		||||
	github.com/unpoller/unifi/v5 v5.0.7
 | 
			
		||||
	golang.org/x/crypto v0.31.0
 | 
			
		||||
	golang.org/x/net v0.33.0
 | 
			
		||||
	golang.org/x/term v0.27.0
 | 
			
		||||
	golift.io/cnfg v0.2.3
 | 
			
		||||
	golift.io/cnfgfile v0.0.0-20240713024420-a5436d84eb48
 | 
			
		||||
	golift.io/version v0.0.2
 | 
			
		||||
	gopkg.in/yaml.v3 v3.0.1
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
require go.yaml.in/yaml/v2 v2.4.2 // indirect
 | 
			
		||||
 | 
			
		||||
require (
 | 
			
		||||
	github.com/BurntSushi/toml v1.5.0 // indirect
 | 
			
		||||
	github.com/Microsoft/go-winio v0.6.2 // indirect
 | 
			
		||||
	github.com/BurntSushi/toml v1.4.0 // indirect
 | 
			
		||||
	github.com/Microsoft/go-winio v0.6.0 // indirect
 | 
			
		||||
	github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
 | 
			
		||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
			
		||||
	github.com/brianvoe/gofakeit/v6 v6.28.0 // indirect
 | 
			
		||||
| 
						 | 
				
			
			@ -36,14 +34,17 @@ require (
 | 
			
		|||
	github.com/google/uuid v1.6.0 // indirect
 | 
			
		||||
	github.com/influxdata/influxdb-client-go/v2 v2.14.0
 | 
			
		||||
	github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf // indirect
 | 
			
		||||
	github.com/klauspost/compress v1.17.9 // indirect
 | 
			
		||||
	github.com/kr/text v0.2.0 // indirect
 | 
			
		||||
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
			
		||||
	github.com/oapi-codegen/runtime v1.1.1 // indirect
 | 
			
		||||
	github.com/pmezard/go-difflib v1.0.0 // indirect
 | 
			
		||||
	github.com/prometheus/client_model v0.6.2 // indirect
 | 
			
		||||
	github.com/prometheus/procfs v0.16.1 // indirect
 | 
			
		||||
	golang.org/x/sys v0.36.0 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.36.8 // indirect
 | 
			
		||||
	github.com/prometheus/client_model v0.6.1 // indirect
 | 
			
		||||
	github.com/prometheus/procfs v0.15.1 // indirect
 | 
			
		||||
	golang.org/x/mod v0.7.0 // indirect
 | 
			
		||||
	golang.org/x/sys v0.28.0 // indirect
 | 
			
		||||
	golang.org/x/tools v0.3.0 // indirect
 | 
			
		||||
	google.golang.org/protobuf v1.35.2 // indirect
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// for local iterative development only
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										78
									
								
								go.sum
								
								
								
								
							
							
						
						
									
										78
									
								
								go.sum
								
								
								
								
							| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
 | 
			
		||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
 | 
			
		||||
github.com/DataDog/datadog-go/v5 v5.7.0 h1:Lcd7cUMiKl5MrNqP7FbNuQ2Le4WKhLb5VVXddWlbGrA=
 | 
			
		||||
github.com/DataDog/datadog-go/v5 v5.7.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw=
 | 
			
		||||
github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0=
 | 
			
		||||
github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
 | 
			
		||||
github.com/DataDog/datadog-go/v5 v5.6.0 h1:2oCLxjF/4htd55piM75baflj/KoE6VYS7alEUqFvRDw=
 | 
			
		||||
github.com/DataDog/datadog-go/v5 v5.6.0/go.mod h1:K9kcYBlxkcPP8tvvjZZKs/m1edNAUFzBbdpTUKfCsuw=
 | 
			
		||||
github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
 | 
			
		||||
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
 | 
			
		||||
github.com/RaveNoX/go-jsoncommentstrip v1.0.0/go.mod h1:78ihd09MekBnJnxpICcwzCMzGrKSKYe4AqU6PDYYpjk=
 | 
			
		||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0 h1:axGnT1gRIfimI7gJifB699GoE/oq+F2MU7Dml6nw9rQ=
 | 
			
		||||
github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP2+08jFMw88y4klk=
 | 
			
		||||
| 
						 | 
				
			
			@ -20,8 +20,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 | 
			
		|||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 | 
			
		||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
 | 
			
		||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
 | 
			
		||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
 | 
			
		||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
			
		||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 | 
			
		||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
			
		||||
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
 | 
			
		||||
| 
						 | 
				
			
			@ -33,8 +33,8 @@ github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod
 | 
			
		|||
github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmneyiNEwVBOHSjoMxiWAqB992atOeepeFYegn5RU=
 | 
			
		||||
github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo=
 | 
			
		||||
github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE=
 | 
			
		||||
github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
 | 
			
		||||
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
 | 
			
		||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
 | 
			
		||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
 | 
			
		||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 | 
			
		||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 | 
			
		||||
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
			
		||||
| 
						 | 
				
			
			@ -49,19 +49,19 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 | 
			
		|||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 | 
			
		||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 | 
			
		||||
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
 | 
			
		||||
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
 | 
			
		||||
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
 | 
			
		||||
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
 | 
			
		||||
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
 | 
			
		||||
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
 | 
			
		||||
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
 | 
			
		||||
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
 | 
			
		||||
github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
 | 
			
		||||
github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
 | 
			
		||||
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
 | 
			
		||||
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
 | 
			
		||||
github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
 | 
			
		||||
github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
 | 
			
		||||
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
 | 
			
		||||
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 | 
			
		||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 | 
			
		||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
			
		||||
github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk=
 | 
			
		||||
github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
			
		||||
github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c h1:zqmyTlQyufRC65JnImJ6H1Sf7BDj8bG31EV919NVEQc=
 | 
			
		||||
github.com/spf13/pflag v1.0.6-0.20201009195203-85dd5c8bc61c/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
 | 
			
		||||
github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0=
 | 
			
		||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 | 
			
		||||
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
 | 
			
		||||
| 
						 | 
				
			
			@ -73,27 +73,27 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
 | 
			
		|||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
			
		||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
 | 
			
		||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 | 
			
		||||
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
 | 
			
		||||
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
 | 
			
		||||
github.com/unpoller/unifi/v5 v5.1.1 h1:1QXWoT8cqeTIzRg2cY7AerxqYtNaxuCdVnuPaOui71c=
 | 
			
		||||
github.com/unpoller/unifi/v5 v5.1.1/go.mod h1:67cwaiQyZ4v5t1NNB3X/E0T5oe9jcZiqyithMgVXDlk=
 | 
			
		||||
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
 | 
			
		||||
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
 | 
			
		||||
github.com/unpoller/unifi/v5 v5.0.7 h1:Dj5HY2Nhdic4Ygvh2YYW6QKIZjXCSo9IBzVDKaj86Zg=
 | 
			
		||||
github.com/unpoller/unifi/v5 v5.0.7/go.mod h1:G45KRuSH9PFrIUFmDTzWEEM/E/e7GuyXp36AVOfhm7I=
 | 
			
		||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 | 
			
		||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 | 
			
		||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 | 
			
		||||
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
 | 
			
		||||
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
 | 
			
		||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
 | 
			
		||||
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
 | 
			
		||||
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 | 
			
		||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 | 
			
		||||
golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
 | 
			
		||||
golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 | 
			
		||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 | 
			
		||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 | 
			
		||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 | 
			
		||||
golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I=
 | 
			
		||||
golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY=
 | 
			
		||||
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
 | 
			
		||||
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 | 
			
		||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
			
		||||
golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
 | 
			
		||||
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
			
		||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
| 
						 | 
				
			
			@ -101,16 +101,18 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w
 | 
			
		|||
golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 | 
			
		||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
			
		||||
golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
 | 
			
		||||
golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
 | 
			
		||||
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
 | 
			
		||||
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 | 
			
		||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
			
		||||
golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ=
 | 
			
		||||
golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA=
 | 
			
		||||
golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q=
 | 
			
		||||
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
 | 
			
		||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 | 
			
		||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 | 
			
		||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
			
		||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 | 
			
		||||
golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM=
 | 
			
		||||
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
			
		||||
| 
						 | 
				
			
			@ -120,8 +122,8 @@ golift.io/cnfgfile v0.0.0-20240713024420-a5436d84eb48 h1:c7cJWRr0cUnFHKtq072esKz
 | 
			
		|||
golift.io/cnfgfile v0.0.0-20240713024420-a5436d84eb48/go.mod h1:zHm9o8SkZ6Mm5DfGahsrEJPsogyR0qItP59s5lJ98/I=
 | 
			
		||||
golift.io/version v0.0.2 h1:i0gXRuSDHKs4O0sVDUg4+vNIuOxYoXhaxspftu2FRTE=
 | 
			
		||||
golift.io/version v0.0.2/go.mod h1:76aHNz8/Pm7CbuxIsDi97jABL5Zui3f2uZxDm4vB6hU=
 | 
			
		||||
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
 | 
			
		||||
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
 | 
			
		||||
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
 | 
			
		||||
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
 | 
			
		||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 | 
			
		||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -106,7 +106,7 @@ func (u *DatadogUnifi) setConfigDefaults() {
 | 
			
		|||
		u.Interval = cnfg.Duration{Duration: minimumInterval}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u.Interval = cnfg.Duration{Duration: u.Interval.Round(time.Second)}
 | 
			
		||||
	u.Interval = cnfg.Duration{Duration: u.Interval.Duration.Round(time.Second)}
 | 
			
		||||
 | 
			
		||||
	u.options = make([]statsd.Option, 0)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -182,7 +182,7 @@ func (u *DatadogUnifi) DebugOutput() (bool, error) {
 | 
			
		|||
 | 
			
		||||
	u.Statsd, err = statsd.New(u.Address, u.options...)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, fmt.Errorf("error configuration Datadog agent reporting: %+v", err)
 | 
			
		||||
		return false, fmt.Errorf("Error configuration Datadog agent reporting: %+v", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true, nil
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,14 +36,14 @@ type mockStatsd struct {
 | 
			
		|||
 | 
			
		||||
// GaugeWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) GaugeWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error {
 | 
			
		||||
	// not supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CountWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) CountWithTimestamp(name string, value int64, tags []string, rate float64, timestamp time.Time) error {
 | 
			
		||||
	// not supported
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -56,25 +56,25 @@ func (m *mockStatsd) IsClosed() bool {
 | 
			
		|||
 | 
			
		||||
// HistogramWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) HistogramWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) HistogramWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DistributionWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) DistributionWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) DistributionWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SetWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) SetWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) SetWithTimestamp(name string, value float64, tags []string, rate float64, timestamp time.Time) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TimingWithTimestamp mock interface
 | 
			
		||||
// nolint:all
 | 
			
		||||
func (m *mockStatsd) TimingWithTimestamp(name string, value int64, tags []string, rate float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) TimingWithTimestamp(name string, value int64, tags []string, rate float64) error {
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +85,7 @@ func (m *mockStatsd) GetTelemetry() statsd.Telemetry {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Gauge measures the value of a metric at a particular time.
 | 
			
		||||
func (m *mockStatsd) Gauge(name string, value float64, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Gauge(name string, value float64, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -95,7 +95,7 @@ func (m *mockStatsd) Gauge(name string, value float64, tags []string, _ float64,
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Count tracks how many times something happened per second.
 | 
			
		||||
func (m *mockStatsd) Count(name string, value int64, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Count(name string, value int64, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ func (m *mockStatsd) Count(name string, value int64, tags []string, _ float64, _
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Histogram tracks the statistical distribution of a set of values on each host.
 | 
			
		||||
func (m *mockStatsd) Histogram(name string, value float64, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Histogram(name string, value float64, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -115,7 +115,7 @@ func (m *mockStatsd) Histogram(name string, value float64, tags []string, _ floa
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Distribution tracks the statistical distribution of a set of values across your infrastructure.
 | 
			
		||||
func (m *mockStatsd) Distribution(name string, value float64, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Distribution(name string, value float64, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -125,7 +125,7 @@ func (m *mockStatsd) Distribution(name string, value float64, tags []string, _ f
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Decr is just Count of -1
 | 
			
		||||
func (m *mockStatsd) Decr(name string, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Decr(name string, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -135,7 +135,7 @@ func (m *mockStatsd) Decr(name string, tags []string, _ float64, _ ...statsd.Par
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Incr is just Count of 1
 | 
			
		||||
func (m *mockStatsd) Incr(name string, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Incr(name string, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -145,7 +145,7 @@ func (m *mockStatsd) Incr(name string, tags []string, _ float64, _ ...statsd.Par
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Set counts the number of unique elements in a group.
 | 
			
		||||
func (m *mockStatsd) Set(name string, value string, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Set(name string, value string, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -155,7 +155,7 @@ func (m *mockStatsd) Set(name string, value string, tags []string, _ float64, _
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Timing sends timing information, it is an alias for TimeInMilliseconds
 | 
			
		||||
func (m *mockStatsd) Timing(name string, value time.Duration, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Timing(name string, value time.Duration, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -166,7 +166,7 @@ func (m *mockStatsd) Timing(name string, value time.Duration, tags []string, _ f
 | 
			
		|||
 | 
			
		||||
// TimeInMilliseconds sends timing information in milliseconds.
 | 
			
		||||
// It is flushed by statsd with percentiles, mean and other info (https://github.com/etsy/statsd/blob/master/docs/metric_types.md#timing)
 | 
			
		||||
func (m *mockStatsd) TimeInMilliseconds(name string, value float64, tags []string, _ float64, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) TimeInMilliseconds(name string, value float64, tags []string, _ float64) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ func (m *mockStatsd) TimeInMilliseconds(name string, value float64, tags []strin
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Event sends the provided Event.
 | 
			
		||||
func (m *mockStatsd) Event(e *statsd.Event, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) Event(e *statsd.Event) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -186,7 +186,7 @@ func (m *mockStatsd) Event(e *statsd.Event, _ ...statsd.Parameter) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// SimpleEvent sends an event with the provided title and text.
 | 
			
		||||
func (m *mockStatsd) SimpleEvent(title, _ string, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) SimpleEvent(title, _ string) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +196,7 @@ func (m *mockStatsd) SimpleEvent(title, _ string, _ ...statsd.Parameter) error {
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// ServiceCheck sends the provided ServiceCheck.
 | 
			
		||||
func (m *mockStatsd) ServiceCheck(sc *statsd.ServiceCheck, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) ServiceCheck(sc *statsd.ServiceCheck) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -206,7 +206,7 @@ func (m *mockStatsd) ServiceCheck(sc *statsd.ServiceCheck, _ ...statsd.Parameter
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// SimpleServiceCheck sends an serviceCheck with the provided name and status.
 | 
			
		||||
func (m *mockStatsd) SimpleServiceCheck(name string, _ statsd.ServiceCheckStatus, _ ...statsd.Parameter) error {
 | 
			
		||||
func (m *mockStatsd) SimpleServiceCheck(name string, _ statsd.ServiceCheckStatus) error {
 | 
			
		||||
	m.Lock()
 | 
			
		||||
	defer m.Unlock()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -366,55 +366,6 @@ gauges:
 | 
			
		|||
  - unifi.ubb.uptime
 | 
			
		||||
  - unifi.ubb.mem
 | 
			
		||||
  - unifi.ubb.network
 | 
			
		||||
  - unifi.ubb.uplink_speed
 | 
			
		||||
  - unifi.ubb.uplink_latency
 | 
			
		||||
  - unifi.ubb.uplink_max_speed
 | 
			
		||||
  - unifi.ubb.uplink_uptime
 | 
			
		||||
  - unifi.usg.uplink_max_speed
 | 
			
		||||
  - unifi.usg.uplink_uptime
 | 
			
		||||
  - unifi.ubb.stat_rx_frags
 | 
			
		||||
  - unifi.uci.stat_tx_retries
 | 
			
		||||
  - unifi.uci.stat_rx_bytes
 | 
			
		||||
  - unifi.ubb.stat_rx_errors
 | 
			
		||||
  - unifi.uci.mem_total
 | 
			
		||||
  - unifi.ubb.stat_rx_packets
 | 
			
		||||
  - unifi.uci.sys
 | 
			
		||||
  - unifi.uci.bytes
 | 
			
		||||
  - unifi.uci.stat_bytes
 | 
			
		||||
  - unifi.uci.stat_rx_errors
 | 
			
		||||
  - unifi.ubb.stat_tx_bytes
 | 
			
		||||
  - unifi.uci.rx_bytes
 | 
			
		||||
  - unifi.uci.mem_used
 | 
			
		||||
  - unifi.uci.probe
 | 
			
		||||
  - unifi.uci.memory
 | 
			
		||||
  - unifi.uci.mem_buffer
 | 
			
		||||
  - unifi.uci.uptime
 | 
			
		||||
  - unifi.ubb.stat_tx_packets
 | 
			
		||||
  - unifi.ubb.stat_tx_retries
 | 
			
		||||
  - unifi.uci.stat_rx_frags
 | 
			
		||||
  - unifi.ubb.stat_rx_crypts
 | 
			
		||||
  - unifi.ubb.stat_tx_dropped
 | 
			
		||||
  - unifi.ubb.stat_rx_dropped
 | 
			
		||||
  - unifi.ubb.stat_bytes
 | 
			
		||||
  - unifi.uci.mem
 | 
			
		||||
  - unifi.uci.stat_rx_crypts
 | 
			
		||||
  - unifi.uci.last_seen
 | 
			
		||||
  - unifi.ubb.stat_rx_bytes
 | 
			
		||||
  - unifi.uci.stat_rx_dropped
 | 
			
		||||
  - unifi.uci.system_uptime
 | 
			
		||||
  - unifi.uci.stat_tx_errors
 | 
			
		||||
  - unifi.uci.network
 | 
			
		||||
  - unifi.ubb.stat_tx_errors
 | 
			
		||||
  - unifi.uci.loadavg_1
 | 
			
		||||
  - unifi.uci.loadavg_5
 | 
			
		||||
  - unifi.uci.cpu
 | 
			
		||||
  - unifi.uci.stat_tx_bytes
 | 
			
		||||
  - unifi.uci.stat_tx_packets
 | 
			
		||||
  - unifi.uci.loadavg_15
 | 
			
		||||
  - unifi.uci.tx_bytes
 | 
			
		||||
  - unifi.uci.stat_rx_packets
 | 
			
		||||
  - unifi.uci.stat_tx_dropped
 | 
			
		||||
  - unifi.uci.state
 | 
			
		||||
counts:
 | 
			
		||||
  - unifi.collector.num_devices
 | 
			
		||||
  - unifi.collector.num_errors
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,17 +45,13 @@ func (u *DatadogUnifi) batchUBB(r report, s *unifi.UBB) { // nolint: funlen
 | 
			
		|||
	data := CombineFloat64(
 | 
			
		||||
		u.batchSysStats(sysStats, systemStats),
 | 
			
		||||
		map[string]float64{
 | 
			
		||||
			"bytes":            s.Bytes.Val,
 | 
			
		||||
			"last_seen":        s.LastSeen.Val,
 | 
			
		||||
			"rx_bytes":         s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":         s.TxBytes.Val,
 | 
			
		||||
			"uptime":           s.Uptime.Val,
 | 
			
		||||
			"state":            s.State.Val,
 | 
			
		||||
			"user_num_sta":     s.UserNumSta.Val,
 | 
			
		||||
			"uplink_speed":     s.Uplink.Speed.Val,
 | 
			
		||||
			"uplink_max_speed": s.Uplink.MaxSpeed.Val,
 | 
			
		||||
			"uplink_latency":   s.Uplink.Latency.Val,
 | 
			
		||||
			"uplink_uptime":    s.Uplink.Uptime.Val,
 | 
			
		||||
			"bytes":        s.Bytes.Val,
 | 
			
		||||
			"last_seen":    s.LastSeen.Val,
 | 
			
		||||
			"rx_bytes":     s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":     s.TxBytes.Val,
 | 
			
		||||
			"uptime":       s.Uptime.Val,
 | 
			
		||||
			"state":        s.State.Val,
 | 
			
		||||
			"user_num_sta": s.UserNumSta.Val,
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -85,7 +81,7 @@ func (u *DatadogUnifi) batchUBB(r report, s *unifi.UBB) { // nolint: funlen
 | 
			
		|||
			"uptime":    s.Uptime.Val,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	metricName = metricNamespace("ubb")
 | 
			
		||||
	metricName = metricNamespace("usw")
 | 
			
		||||
	reportGaugeForFloat64Map(r, metricName, data, tags)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,7 +56,7 @@ func (u *DatadogUnifi) batchUCI(r report, s *unifi.UCI) { // nolint: funlen
 | 
			
		|||
 | 
			
		||||
	r.addCount(uciT)
 | 
			
		||||
 | 
			
		||||
	metricName := metricNamespace("uci")
 | 
			
		||||
	metricName := metricNamespace("usg")
 | 
			
		||||
	reportGaugeForFloat64Map(r, metricName, data, tags)
 | 
			
		||||
 | 
			
		||||
	tags = cleanTags(map[string]string{
 | 
			
		||||
| 
						 | 
				
			
			@ -80,6 +80,6 @@ func (u *DatadogUnifi) batchUCI(r report, s *unifi.UCI) { // nolint: funlen
 | 
			
		|||
			"uptime":    s.Uptime.Val,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	metricName = metricNamespace("uci")
 | 
			
		||||
	metricName = metricNamespace("usw")
 | 
			
		||||
	reportGaugeForFloat64Map(r, metricName, data, tags)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,8 +64,6 @@ func (u *DatadogUnifi) batchUSGstats(ss unifi.SpeedtestStatus, gw *unifi.Gw, ul
 | 
			
		|||
	return map[string]float64{
 | 
			
		||||
		"uplink_latency":                 ul.Latency.Val,
 | 
			
		||||
		"uplink_speed":                   ul.Speed.Val,
 | 
			
		||||
		"uplink_max_speed":               ul.MaxSpeed.Val,
 | 
			
		||||
		"uplink_uptime":                  ul.Uptime.Val,
 | 
			
		||||
		"speedtest_status_latency":       ss.Latency.Val,
 | 
			
		||||
		"speedtest_status_runtime":       ss.Runtime.Val,
 | 
			
		||||
		"speedtest_status_rundate":       ss.Rundate.Val,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,10 +40,6 @@ func (u *DatadogUnifi) batchUSW(r report, s *unifi.USW) {
 | 
			
		|||
			"state":               s.State.Val,
 | 
			
		||||
			"user_num_sta":        s.UserNumSta.Val,
 | 
			
		||||
			"upgradeable":         boolToFloat64(s.Upgradeable.Val),
 | 
			
		||||
			"uplink_speed":        s.Uplink.Speed.Val,
 | 
			
		||||
			"uplink_max_speed":    s.Uplink.MaxSpeed.Val,
 | 
			
		||||
			"uplink_latency":      s.Uplink.Latency.Val,
 | 
			
		||||
			"uplink_uptime":       s.Uplink.Uptime.Val,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	r.addCount(uswT)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,21 +43,17 @@ func (u *DatadogUnifi) batchUXG(r report, s *unifi.UXG) { // nolint: funlen
 | 
			
		|||
		u.batchUSGstats(s.SpeedtestStatus, gw, s.Uplink),
 | 
			
		||||
		u.batchSysStats(s.SysStats, s.SystemStats),
 | 
			
		||||
		map[string]float64{
 | 
			
		||||
			"bytes":            s.Bytes.Val,
 | 
			
		||||
			"last_seen":        s.LastSeen.Val,
 | 
			
		||||
			"guest_num_sta":    s.GuestNumSta.Val,
 | 
			
		||||
			"rx_bytes":         s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":         s.TxBytes.Val,
 | 
			
		||||
			"uptime":           s.Uptime.Val,
 | 
			
		||||
			"state":            s.State.Val,
 | 
			
		||||
			"user_num_sta":     s.UserNumSta.Val,
 | 
			
		||||
			"num_desktop":      s.NumDesktop.Val,
 | 
			
		||||
			"num_handheld":     s.NumHandheld.Val,
 | 
			
		||||
			"num_mobile":       s.NumMobile.Val,
 | 
			
		||||
			"uplink_speed":     s.Uplink.Speed.Val,
 | 
			
		||||
			"uplink_max_speed": s.Uplink.MaxSpeed.Val,
 | 
			
		||||
			"uplink_latency":   s.Uplink.Latency.Val,
 | 
			
		||||
			"uplink_uptime":    s.Uplink.Uptime.Val,
 | 
			
		||||
			"bytes":         s.Bytes.Val,
 | 
			
		||||
			"last_seen":     s.LastSeen.Val,
 | 
			
		||||
			"guest_num_sta": s.GuestNumSta.Val,
 | 
			
		||||
			"rx_bytes":      s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":      s.TxBytes.Val,
 | 
			
		||||
			"uptime":        s.Uptime.Val,
 | 
			
		||||
			"state":         s.State.Val,
 | 
			
		||||
			"user_num_sta":  s.UserNumSta.Val,
 | 
			
		||||
			"num_desktop":   s.NumDesktop.Val,
 | 
			
		||||
			"num_handheld":  s.NumHandheld.Val,
 | 
			
		||||
			"num_mobile":    s.NumMobile.Val,
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -165,7 +165,7 @@ func (u *InfluxUnifi) DebugOutput() (bool, error) {
 | 
			
		|||
 | 
			
		||||
	u.setConfigDefaults()
 | 
			
		||||
 | 
			
		||||
	_, err := url.Parse(u.URL)
 | 
			
		||||
	_, err := url.Parse(u.Config.URL)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false, fmt.Errorf("invalid influx URL: %v", err)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -223,7 +223,7 @@ func (u *InfluxUnifi) Run(c poller.Collect) error {
 | 
			
		|||
 | 
			
		||||
	u.setConfigDefaults()
 | 
			
		||||
 | 
			
		||||
	_, err = url.Parse(u.URL)
 | 
			
		||||
	_, err = url.Parse(u.Config.URL)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		u.LogErrorf("invalid influx URL: %v", err)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -304,7 +304,7 @@ func (u *InfluxUnifi) setConfigDefaults() {
 | 
			
		|||
		u.Interval = cnfg.Duration{Duration: minimumInterval}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u.Interval = cnfg.Duration{Duration: u.Interval.Round(time.Second)}
 | 
			
		||||
	u.Interval = cnfg.Duration{Duration: u.Interval.Duration.Round(time.Second)}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (u *InfluxUnifi) getPassFromFile(filename string) string {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -402,19 +402,9 @@ points:
 | 
			
		|||
      - version
 | 
			
		||||
    fields:
 | 
			
		||||
      bytes: float
 | 
			
		||||
      cpu: float
 | 
			
		||||
      ip: string
 | 
			
		||||
      last_seen: float
 | 
			
		||||
      license_state: string
 | 
			
		||||
      loadavg_1: float
 | 
			
		||||
      loadavg_5: float
 | 
			
		||||
      loadavg_15: float
 | 
			
		||||
      mem: float
 | 
			
		||||
      mem_buffer: float
 | 
			
		||||
      mem_total: float
 | 
			
		||||
      mem_used: float
 | 
			
		||||
      rx_bytes: float
 | 
			
		||||
      source: string
 | 
			
		||||
      stat_bytes: float
 | 
			
		||||
      stat_rx_bytes: float
 | 
			
		||||
      stat_rx_crypts: float
 | 
			
		||||
| 
						 | 
				
			
			@ -427,68 +417,8 @@ points:
 | 
			
		|||
      stat_tx_errors: float
 | 
			
		||||
      stat_tx_packets: float
 | 
			
		||||
      stat_tx_retries: float
 | 
			
		||||
      state: float
 | 
			
		||||
      system_uptime: float
 | 
			
		||||
      temp_cpu: int
 | 
			
		||||
      temp_memory: int
 | 
			
		||||
      temp_network: int
 | 
			
		||||
      temp_probe: int
 | 
			
		||||
      temp_sys: int
 | 
			
		||||
      tx_bytes: float
 | 
			
		||||
      uplink_latency: float
 | 
			
		||||
      uplink_max_speed: float
 | 
			
		||||
      uplink_speed: float
 | 
			
		||||
      uplink_uptime: float
 | 
			
		||||
      uptime: float
 | 
			
		||||
      user-num_sta: float
 | 
			
		||||
      version: string
 | 
			
		||||
  uci:
 | 
			
		||||
    tags:
 | 
			
		||||
      - mac
 | 
			
		||||
      - model
 | 
			
		||||
      - name
 | 
			
		||||
      - serial
 | 
			
		||||
      - site_name
 | 
			
		||||
      - source
 | 
			
		||||
      - type
 | 
			
		||||
      - version
 | 
			
		||||
    fields:
 | 
			
		||||
      bytes: float
 | 
			
		||||
      cpu: float
 | 
			
		||||
      ip: string
 | 
			
		||||
      last_seen: float
 | 
			
		||||
      license_state: string
 | 
			
		||||
      loadavg_1: float
 | 
			
		||||
      loadavg_5: float
 | 
			
		||||
      loadavg_15: float
 | 
			
		||||
      mem: float
 | 
			
		||||
      mem_buffer: float
 | 
			
		||||
      mem_total: float
 | 
			
		||||
      mem_used: float
 | 
			
		||||
      rx_bytes: float
 | 
			
		||||
      source: string
 | 
			
		||||
      stat_bytes: float
 | 
			
		||||
      stat_rx_bytes: float
 | 
			
		||||
      stat_rx_crypts: float
 | 
			
		||||
      stat_rx_dropped: float
 | 
			
		||||
      stat_rx_errors: float
 | 
			
		||||
      stat_rx_frags: float
 | 
			
		||||
      stat_rx_packets: float
 | 
			
		||||
      stat_tx_bytes: float
 | 
			
		||||
      stat_tx_dropped: float
 | 
			
		||||
      stat_tx_errors: float
 | 
			
		||||
      stat_tx_packets: float
 | 
			
		||||
      stat_tx_retries: float
 | 
			
		||||
      state: float
 | 
			
		||||
      system_uptime: float
 | 
			
		||||
      temp_cpu: int
 | 
			
		||||
      temp_memory: int
 | 
			
		||||
      temp_network: int
 | 
			
		||||
      temp_probe: int
 | 
			
		||||
      temp_sys: int
 | 
			
		||||
      tx_bytes: float
 | 
			
		||||
      uptime: float
 | 
			
		||||
      version: string
 | 
			
		||||
  unifi_alarm:
 | 
			
		||||
    tags:
 | 
			
		||||
      - action
 | 
			
		||||
| 
						 | 
				
			
			@ -685,11 +615,9 @@ points:
 | 
			
		|||
      tx_bytes: float
 | 
			
		||||
      upgradeable: bool
 | 
			
		||||
      uplink_latency: float
 | 
			
		||||
      uplink_max_speed: float
 | 
			
		||||
      uplink_name: string
 | 
			
		||||
      uplink_speed: float
 | 
			
		||||
      uplink_type: string
 | 
			
		||||
      uplink_uptime: float
 | 
			
		||||
      uptime: float
 | 
			
		||||
      user-num_sta: float
 | 
			
		||||
      version: string
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,26 +43,22 @@ func (u *InfluxUnifi) batchUBB(r report, s *unifi.UBB) { // nolint: funlen
 | 
			
		|||
	fields := Combine(
 | 
			
		||||
		u.batchSysStats(sysStats, systemStats),
 | 
			
		||||
		map[string]any{
 | 
			
		||||
			"source":           s.SourceName,
 | 
			
		||||
			"ip":               s.IP,
 | 
			
		||||
			"bytes":            s.Bytes.Val,
 | 
			
		||||
			"last_seen":        s.LastSeen.Val,
 | 
			
		||||
			"license_state":    s.LicenseState,
 | 
			
		||||
			"rx_bytes":         s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":         s.TxBytes.Val,
 | 
			
		||||
			"uptime":           s.Uptime.Val,
 | 
			
		||||
			"state":            s.State.Val,
 | 
			
		||||
			"user-num_sta":     s.UserNumSta.Val,
 | 
			
		||||
			"version":          s.Version,
 | 
			
		||||
			"uplink_speed":     s.Uplink.Speed.Val,
 | 
			
		||||
			"uplink_max_speed": s.Uplink.MaxSpeed.Val,
 | 
			
		||||
			"uplink_latency":   s.Uplink.Latency.Val,
 | 
			
		||||
			"uplink_uptime":    s.Uplink.Uptime.Val,
 | 
			
		||||
			"source":        s.SourceName,
 | 
			
		||||
			"ip":            s.IP,
 | 
			
		||||
			"bytes":         s.Bytes.Val,
 | 
			
		||||
			"last_seen":     s.LastSeen.Val,
 | 
			
		||||
			"license_state": s.LicenseState,
 | 
			
		||||
			"rx_bytes":      s.RxBytes.Val,
 | 
			
		||||
			"tx_bytes":      s.TxBytes.Val,
 | 
			
		||||
			"uptime":        s.Uptime.Val,
 | 
			
		||||
			"state":         s.State.Val,
 | 
			
		||||
			"user-num_sta":  s.UserNumSta.Val,
 | 
			
		||||
			"version":       s.Version,
 | 
			
		||||
		},
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	r.addCount(ubbT)
 | 
			
		||||
	r.send(&metric{Table: "ubb", Tags: tags, Fields: fields})
 | 
			
		||||
	r.send(&metric{Table: "usg", Tags: tags, Fields: fields})
 | 
			
		||||
 | 
			
		||||
	tags = map[string]string{
 | 
			
		||||
		"mac":       s.Mac,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ func (u *InfluxUnifi) batchUCI(r report, s *unifi.UCI) { // nolint: funlen
 | 
			
		|||
	)
 | 
			
		||||
 | 
			
		||||
	r.addCount(uciT)
 | 
			
		||||
	r.send(&metric{Table: "uci", Tags: tags, Fields: fields})
 | 
			
		||||
	r.send(&metric{Table: "usg", Tags: tags, Fields: fields})
 | 
			
		||||
 | 
			
		||||
	tags = map[string]string{
 | 
			
		||||
		"mac":       s.Mac,
 | 
			
		||||
| 
						 | 
				
			
			@ -80,5 +80,5 @@ func (u *InfluxUnifi) batchUCI(r report, s *unifi.UCI) { // nolint: funlen
 | 
			
		|||
			"uptime":    s.Uptime.Val,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	r.send(&metric{Table: "uci", Tags: tags, Fields: fields})
 | 
			
		||||
	r.send(&metric{Table: "usw", Tags: tags, Fields: fields})
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,8 +63,6 @@ func (u *InfluxUnifi) batchUSGstats(ss unifi.SpeedtestStatus, gw *unifi.Gw, ul u
 | 
			
		|||
		"uplink_name":                    ul.Name,
 | 
			
		||||
		"uplink_latency":                 ul.Latency.Val,
 | 
			
		||||
		"uplink_speed":                   ul.Speed.Val,
 | 
			
		||||
		"uplink_max_speed":               ul.MaxSpeed.Val,
 | 
			
		||||
		"uplink_uptime":                  ul.Uptime.Val,
 | 
			
		||||
		"uplink_type":                    ul.Type,
 | 
			
		||||
		"speedtest-status_latency":       ss.Latency.Val,
 | 
			
		||||
		"speedtest-status_runtime":       ss.Runtime.Val,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,10 +40,6 @@ func (u *InfluxUnifi) batchUSW(r report, s *unifi.USW) {
 | 
			
		|||
			"state":               s.State.Val,
 | 
			
		||||
			"user-num_sta":        s.UserNumSta.Val,
 | 
			
		||||
			"upgradeable":         s.Upgradable.Val,
 | 
			
		||||
			"uplink_speed":        s.Uplink.Speed.Val,
 | 
			
		||||
			"uplink_max_speed":    s.Uplink.MaxSpeed.Val,
 | 
			
		||||
			"uplink_latency":      s.Uplink.Latency.Val,
 | 
			
		||||
			"uplink_uptime":       s.Uplink.Uptime.Val,
 | 
			
		||||
		})
 | 
			
		||||
 | 
			
		||||
	r.addCount(uswT)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -278,14 +278,7 @@ func (u *InputUnifi) getFilteredSites(c *Controller) ([]*unifi.Site, error) {
 | 
			
		|||
	sites, err := c.Unifi.GetSites()
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("controller: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Apply the default_site_name_override to the first site in the list, if configured.
 | 
			
		||||
	if len(sites) > 0 && c.DefaultSiteNameOverride != "" {
 | 
			
		||||
		sites[0].Name = c.DefaultSiteNameOverride
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(c.Sites) == 0 || StringInSlice("all", c.Sites) {
 | 
			
		||||
	} else if len(c.Sites) == 0 || StringInSlice("all", c.Sites) {
 | 
			
		||||
		return sites, nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,25 +34,23 @@ type InputUnifi struct {
 | 
			
		|||
// Controller represents the configuration for a UniFi Controller.
 | 
			
		||||
// Each polled controller may have its own configuration.
 | 
			
		||||
type Controller struct {
 | 
			
		||||
	VerifySSL              *bool        `json:"verify_ssl"     toml:"verify_ssl"     xml:"verify_ssl"     yaml:"verify_ssl"`
 | 
			
		||||
	SaveAnomal             *bool        `json:"save_anomalies" toml:"save_anomalies" xml:"save_anomalies" yaml:"save_anomalies"`
 | 
			
		||||
	SaveAlarms             *bool        `json:"save_alarms"    toml:"save_alarms"    xml:"save_alarms"    yaml:"save_alarms"`
 | 
			
		||||
	SaveEvents             *bool        `json:"save_events"    toml:"save_events"    xml:"save_events"    yaml:"save_events"`
 | 
			
		||||
	SaveIDs                *bool        `json:"save_ids"       toml:"save_ids"       xml:"save_ids"       yaml:"save_ids"`
 | 
			
		||||
	SaveDPI                *bool        `json:"save_dpi"       toml:"save_dpi"       xml:"save_dpi"       yaml:"save_dpi"`
 | 
			
		||||
	SaveRogue              *bool        `json:"save_rogue"     toml:"save_rogue"     xml:"save_rogue"     yaml:"save_rogue"`
 | 
			
		||||
	HashPII                *bool        `json:"hash_pii"       toml:"hash_pii"       xml:"hash_pii"       yaml:"hash_pii"`
 | 
			
		||||
	DropPII                *bool        `json:"drop_pii"       toml:"drop_pii"       xml:"drop_pii"       yaml:"drop_pii"`
 | 
			
		||||
	SaveSites              *bool        `json:"save_sites"     toml:"save_sites"     xml:"save_sites"     yaml:"save_sites"`
 | 
			
		||||
	CertPaths              []string     `json:"ssl_cert_paths" toml:"ssl_cert_paths" xml:"ssl_cert_path"  yaml:"ssl_cert_paths"`
 | 
			
		||||
	User                   string       `json:"user"           toml:"user"           xml:"user"           yaml:"user"`
 | 
			
		||||
	Pass                   string       `json:"pass"           toml:"pass"           xml:"pass"           yaml:"pass"`
 | 
			
		||||
	APIKey                 string       `json:"api_key"        toml:"api_key"        xml:"api_key"        yaml:"api_key"`
 | 
			
		||||
	URL                    string       `json:"url"            toml:"url"            xml:"url"            yaml:"url"`
 | 
			
		||||
	Sites                  []string     `json:"sites"          toml:"sites"          xml:"site"           yaml:"sites"`
 | 
			
		||||
	DefaultSiteNameOverride string       `json:"default_site_name_override" toml:"default_site_name_override" xml:"default_site_name_override" yaml:"default_site_name_override"`
 | 
			
		||||
	Unifi                  *unifi.Unifi `json:"-"              toml:"-"              xml:"-"              yaml:"-"`
 | 
			
		||||
	ID                     string       `json:"id,omitempty"` // this is an output, not an input.
 | 
			
		||||
	VerifySSL  *bool        `json:"verify_ssl"     toml:"verify_ssl"     xml:"verify_ssl"     yaml:"verify_ssl"`
 | 
			
		||||
	SaveAnomal *bool        `json:"save_anomalies" toml:"save_anomalies" xml:"save_anomalies" yaml:"save_anomalies"`
 | 
			
		||||
	SaveAlarms *bool        `json:"save_alarms"    toml:"save_alarms"    xml:"save_alarms"    yaml:"save_alarms"`
 | 
			
		||||
	SaveEvents *bool        `json:"save_events"    toml:"save_events"    xml:"save_events"    yaml:"save_events"`
 | 
			
		||||
	SaveIDs    *bool        `json:"save_ids"       toml:"save_ids"       xml:"save_ids"       yaml:"save_ids"`
 | 
			
		||||
	SaveDPI    *bool        `json:"save_dpi"       toml:"save_dpi"       xml:"save_dpi"       yaml:"save_dpi"`
 | 
			
		||||
	SaveRogue  *bool        `json:"save_rogue"     toml:"save_rogue"     xml:"save_rogue"     yaml:"save_rogue"`
 | 
			
		||||
	HashPII    *bool        `json:"hash_pii"       toml:"hash_pii"       xml:"hash_pii"       yaml:"hash_pii"`
 | 
			
		||||
	DropPII    *bool        `json:"drop_pii"       toml:"drop_pii"       xml:"drop_pii"       yaml:"drop_pii"`
 | 
			
		||||
	SaveSites  *bool        `json:"save_sites"     toml:"save_sites"     xml:"save_sites"     yaml:"save_sites"`
 | 
			
		||||
	CertPaths  []string     `json:"ssl_cert_paths" toml:"ssl_cert_paths" xml:"ssl_cert_path"  yaml:"ssl_cert_paths"`
 | 
			
		||||
	User       string       `json:"user"           toml:"user"           xml:"user"           yaml:"user"`
 | 
			
		||||
	Pass       string       `json:"pass"           toml:"pass"           xml:"pass"           yaml:"pass"`
 | 
			
		||||
	URL        string       `json:"url"            toml:"url"            xml:"url"            yaml:"url"`
 | 
			
		||||
	Sites      []string     `json:"sites"          toml:"sites"          xml:"site"           yaml:"sites"`
 | 
			
		||||
	Unifi      *unifi.Unifi `json:"-"              toml:"-"              xml:"-"              yaml:"-"`
 | 
			
		||||
	ID         string       `json:"id,omitempty"` // this is an output, not an input.
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Config contains our configuration data.
 | 
			
		||||
| 
						 | 
				
			
			@ -126,7 +124,6 @@ func (u *InputUnifi) getUnifi(c *Controller) error {
 | 
			
		|||
	c.Unifi, err = unifi.NewUnifi(&unifi.Config{
 | 
			
		||||
		User:      c.User,
 | 
			
		||||
		Pass:      c.Pass,
 | 
			
		||||
		APIKey:    c.APIKey,
 | 
			
		||||
		URL:       c.URL,
 | 
			
		||||
		SSLCert:   certs,
 | 
			
		||||
		VerifySSL: *c.VerifySSL,
 | 
			
		||||
| 
						 | 
				
			
			@ -258,22 +255,12 @@ func (u *InputUnifi) setDefaults(c *Controller) { //nolint:cyclop
 | 
			
		|||
		c.Pass = u.getPassFromFile(strings.TrimPrefix(c.Pass, "file://"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if strings.HasPrefix(c.APIKey, "file://") {
 | 
			
		||||
		c.APIKey = u.getPassFromFile(strings.TrimPrefix(c.APIKey, "file://"))
 | 
			
		||||
	if c.Pass == "" {
 | 
			
		||||
		c.Pass = defaultPass
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.APIKey == "" {
 | 
			
		||||
		if c.Pass == "" {
 | 
			
		||||
			c.Pass = defaultPass
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c.User == "" {
 | 
			
		||||
			c.User = defaultUser
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		// clear out user/pass combo, only use API-key
 | 
			
		||||
		c.User = ""
 | 
			
		||||
		c.Pass = ""
 | 
			
		||||
	if c.User == "" {
 | 
			
		||||
		c.User = defaultUser
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(c.Sites) == 0 {
 | 
			
		||||
| 
						 | 
				
			
			@ -337,33 +324,18 @@ func (u *InputUnifi) setControllerDefaults(c *Controller) *Controller { //nolint
 | 
			
		|||
		c.Pass = u.getPassFromFile(strings.TrimPrefix(c.Pass, "file://"))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if strings.HasPrefix(c.APIKey, "file://") {
 | 
			
		||||
		c.APIKey = u.getPassFromFile(strings.TrimPrefix(c.APIKey, "file://"))
 | 
			
		||||
	if c.Pass == "" {
 | 
			
		||||
		c.Pass = u.Default.Pass
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if c.APIKey == "" {
 | 
			
		||||
		if c.Pass == "" {
 | 
			
		||||
			c.Pass = defaultPass
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if c.User == "" {
 | 
			
		||||
			c.User = defaultUser
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		// clear out user/pass combo, only use API-key
 | 
			
		||||
		c.User = ""
 | 
			
		||||
		c.Pass = ""
 | 
			
		||||
	if c.User == "" {
 | 
			
		||||
		c.User = u.Default.User
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(c.Sites) == 0 {
 | 
			
		||||
		c.Sites = u.Default.Sites
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Added handling for the new default_site_name_override parameter.
 | 
			
		||||
	if c.DefaultSiteNameOverride == "" {
 | 
			
		||||
		c.DefaultSiteNameOverride = u.Default.DefaultSiteNameOverride
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ func (u *InputUnifi) logController(c *Controller) {
 | 
			
		|||
		u.Logf("   => Version: %s (%s)", c.Unifi.ServerVersion, c.Unifi.UUID)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	u.Logf("   => Username: %s (has password: %v) (has api-key: %v)", c.User, c.Pass != "", c.APIKey != "")
 | 
			
		||||
	u.Logf("   => Username: %s (has password: %v)", c.User, c.Pass != "")
 | 
			
		||||
	u.Logf("   => Hash PII %v / Drop PII %v / Poll Sites: %s", *c.HashPII, *c.DropPII, strings.Join(c.Sites, ", "))
 | 
			
		||||
	u.Logf("   => Save Sites %v / Save DPI %v (metrics)", *c.SaveSites, *c.SaveDPI)
 | 
			
		||||
	u.Logf("   => Save Events %v / Save IDs %v (logs)", *c.SaveEvents, *c.SaveIDs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,6 @@ func formatControllers(controllers []*Controller) []*Controller {
 | 
			
		|||
			SaveSites:  c.SaveSites,
 | 
			
		||||
			User:       c.User,
 | 
			
		||||
			Pass:       strconv.FormatBool(c.Pass != ""),
 | 
			
		||||
			APIKey:     strconv.FormatBool(c.APIKey != ""),
 | 
			
		||||
			URL:        c.URL,
 | 
			
		||||
			Sites:      c.Sites,
 | 
			
		||||
			ID:         id,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -180,11 +180,6 @@ func (l *Loki) ProcessEvents(report *Report, events *poller.Events) error {
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	logs := report.ProcessEventLogs(events)
 | 
			
		||||
	if len(logs.Streams) == 0 {
 | 
			
		||||
		l.LogDebugf("No new events to send to Loki.")
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := l.client.Post(logs); err != nil {
 | 
			
		||||
		return fmt.Errorf("sending to Loki failed: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -88,7 +88,7 @@ func (f *Flags) Parse(args []string) {
 | 
			
		|||
// 3. Start a web server and wait for Prometheus to poll the application for metrics.
 | 
			
		||||
func (u *UnifiPoller) Run() error {
 | 
			
		||||
	if u.Flags.DumpJSON != "" {
 | 
			
		||||
		u.Quiet = true
 | 
			
		||||
		u.Config.Quiet = true
 | 
			
		||||
		if err := u.InitializeInputs(); err != nil {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -306,7 +306,7 @@ func (u *promUnifi) collect(ch chan<- prometheus.Metric, filter *poller.Filter)
 | 
			
		|||
 | 
			
		||||
	r := &Report{
 | 
			
		||||
		Config: u.Config,
 | 
			
		||||
		ch:     make(chan []*metric, u.Buffer),
 | 
			
		||||
		ch:     make(chan []*metric, u.Config.Buffer),
 | 
			
		||||
		Start:  time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
	defer r.close()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,8 +32,6 @@ type usg struct {
 | 
			
		|||
	Latency        *prometheus.Desc
 | 
			
		||||
	UplinkLatency  *prometheus.Desc
 | 
			
		||||
	UplinkSpeed    *prometheus.Desc
 | 
			
		||||
	UplinkMaxSpeed *prometheus.Desc
 | 
			
		||||
	UplinkUptime   *prometheus.Desc
 | 
			
		||||
	Runtime        *prometheus.Desc
 | 
			
		||||
	Rundate        *prometheus.Desc
 | 
			
		||||
	XputDownload   *prometheus.Desc
 | 
			
		||||
| 
						 | 
				
			
			@ -67,8 +65,6 @@ func descUSG(ns string) *usg {
 | 
			
		|||
		LanTxBytes:     prometheus.NewDesc(ns+"lan_transmit_bytes_total", "LAN Transmit Bytes Total", labels, nil),
 | 
			
		||||
		UplinkLatency:  prometheus.NewDesc(ns+"uplink_latency_seconds", "Uplink Latency", labels, nil),
 | 
			
		||||
		UplinkSpeed:    prometheus.NewDesc(ns+"uplink_speed_mbps", "Uplink Speed", labels, nil),
 | 
			
		||||
		UplinkMaxSpeed: prometheus.NewDesc(ns+"uplink_max_speed_mbps", "Uplink Max Speed", labels, nil),
 | 
			
		||||
		UplinkUptime:   prometheus.NewDesc(ns+"uplink_uptime_seconds", "Uplink Uptime", labels, nil),
 | 
			
		||||
		Latency:        prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labels, nil),
 | 
			
		||||
		Runtime:        prometheus.NewDesc(ns+"speedtest_runtime_seconds", "Speedtest Run Time", labels, nil),
 | 
			
		||||
		Rundate:        prometheus.NewDesc(ns+"speedtest_rundate_seconds", "Speedtest Run Date", labels, nil),
 | 
			
		||||
| 
						 | 
				
			
			@ -136,8 +132,6 @@ func (u *promUnifi) exportUSGstats(r report, labels []string, gw *unifi.Gw, st u
 | 
			
		|||
		{u.USG.LanRxDropped, counter, gw.LanRxDropped, labelLan},
 | 
			
		||||
		{u.USG.UplinkLatency, gauge, ul.Latency.Val / 1000, labelWan},
 | 
			
		||||
		{u.USG.UplinkSpeed, gauge, ul.Speed, labelWan},
 | 
			
		||||
		{u.USG.UplinkMaxSpeed, gauge, ul.MaxSpeed, labelWan},
 | 
			
		||||
		{u.USG.UplinkUptime, gauge, ul.Uptime, labelWan},
 | 
			
		||||
		// Speed Test Stats
 | 
			
		||||
		{u.USG.Latency, gauge, st.Latency.Val / 1000, labelWan},
 | 
			
		||||
		{u.USG.Runtime, gauge, st.Runtime, labelWan},
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -176,7 +176,7 @@ func (w *webPlugins) newInputEvent(plugin, id string, event *Event) {
 | 
			
		|||
		input.Events[id] = &EventGroup{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	input.Events[id].add(event, int(w.MaxEvents))
 | 
			
		||||
	input.Events[id].add(event, int(w.Config.MaxEvents))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *webPlugins) newOutputEvent(plugin, id string, event *Event) {
 | 
			
		||||
| 
						 | 
				
			
			@ -196,7 +196,7 @@ func (w *webPlugins) newOutputEvent(plugin, id string, event *Event) {
 | 
			
		|||
		output.Events[id] = &EventGroup{}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	output.Events[id].add(event, int(w.MaxEvents))
 | 
			
		||||
	output.Events[id].add(event, int(w.Config.MaxEvents))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (w *webPlugins) newInput(config *Input) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue