├── .github ├── FUNDING.yml └── workflows │ ├── build.yml │ └── lint.yml ├── .gitignore ├── .golangci.yml ├── .goreleaser.yml ├── Dockerfile.goreleaser ├── LICENSE ├── README.md ├── go.mod ├── go.sum ├── grafana ├── dashboard.json └── project_dashboard.json ├── issues.go ├── main.go ├── notifications_cmd.go ├── pr.go ├── relationships_cmd.go ├── repos.go ├── repository_cmd.go ├── screenshots ├── project_commits.png ├── project_forks.png ├── project_issues.png ├── project_issues_labels.png ├── project_issues_labels_bars.png ├── project_prs.png ├── project_prs_labels.png ├── project_prs_labels_bars.png ├── project_stars.png ├── project_watchers.png ├── repo_commits.png ├── repo_forks.png ├── repo_issues.png ├── repo_prs.png ├── repo_stars.png ├── repo_watchers.png ├── user_followers.png └── user_notifications.png ├── sponsors.go ├── sponsors_cmd.go └── users.go /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: muesli 2 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | build: 6 | strategy: 7 | matrix: 8 | go-version: [~1.13, ^1] 9 | os: [ubuntu-latest, macos-latest, windows-latest] 10 | runs-on: ${{ matrix.os }} 11 | env: 12 | GO111MODULE: "on" 13 | steps: 14 | - name: Install Go 15 | uses: actions/setup-go@v2 16 | with: 17 | go-version: ${{ matrix.go-version }} 18 | 19 | - name: Checkout code 20 | uses: actions/checkout@v2 21 | 22 | - name: Download Go modules 23 | run: go mod download 24 | 25 | - name: Build 26 | run: go build -v ./... 27 | 28 | - name: Test 29 | run: go test ./... 30 | -------------------------------------------------------------------------------- /.github/workflows/lint.yml: -------------------------------------------------------------------------------- 1 | name: lint 2 | on: 3 | push: 4 | pull_request: 5 | 6 | jobs: 7 | golangci: 8 | name: lint 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - name: golangci-lint 13 | uses: golangci/golangci-lint-action@v2 14 | with: 15 | # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. 16 | version: v1.30 17 | # Optional: golangci-lint command line arguments. 18 | args: --issues-exit-code=0 19 | # Optional: working directory, useful for monorepos 20 | # working-directory: somedir 21 | # Optional: show only new issues if it's a pull request. The default value is `false`. 22 | only-new-issues: true 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | 8 | # Test binary, built with `go test -c` 9 | *.test 10 | 11 | # Output of the go coverage tool, specifically when used with LiteIDE 12 | *.out 13 | 14 | # Dependency directories (remove the comment below to include it) 15 | # vendor/ 16 | 17 | gitflux 18 | dist/ 19 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | run: 2 | tests: false 3 | 4 | issues: 5 | max-issues-per-linter: 0 6 | max-same-issues: 0 7 | 8 | linters: 9 | enable: 10 | - bodyclose 11 | - dupl 12 | - exportloopref 13 | - goconst 14 | - godot 15 | - godox 16 | - goimports 17 | - goprintffuncname 18 | - gosec 19 | - misspell 20 | - prealloc 21 | - rowserrcheck 22 | - sqlclosecheck 23 | - unconvert 24 | - unparam 25 | - whitespace 26 | -------------------------------------------------------------------------------- /.goreleaser.yml: -------------------------------------------------------------------------------- 1 | before: 2 | hooks: 3 | - go mod tidy 4 | gomod: 5 | proxy: true 6 | builds: 7 | - env: 8 | - CGO_ENABLED=0 9 | goos: 10 | - linux 11 | - darwin 12 | goarch: 13 | - amd64 14 | - arm64 15 | nfpms: 16 | - homepage: https://fribbledom.com/ 17 | maintainer: Christian Muehlhaeuser 18 | description: Track your GitHub projects in InfluxDB and create beautiful graphs with Grafana 19 | formats: 20 | - deb 21 | - apk 22 | - rpm 23 | dockers: 24 | - image_templates: 25 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-amd64' 26 | dockerfile: Dockerfile.goreleaser 27 | use_buildx: true 28 | build_flag_templates: 29 | - "--pull" 30 | - "--label=org.opencontainers.image.created={{.Date}}" 31 | - "--label=org.opencontainers.image.name={{.ProjectName}}" 32 | - "--label=org.opencontainers.image.revision={{.FullCommit}}" 33 | - "--label=org.opencontainers.image.version={{.Version}}" 34 | - "--label=org.opencontainers.image.source=https://github.com/muesli/gitflux" 35 | - "--platform=linux/amd64" 36 | - image_templates: 37 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-arm64' 38 | dockerfile: Dockerfile.goreleaser 39 | use_buildx: true 40 | build_flag_templates: 41 | - "--pull" 42 | - "--label=org.opencontainers.image.created={{.Date}}" 43 | - "--label=org.opencontainers.image.name={{.ProjectName}}" 44 | - "--label=org.opencontainers.image.revision={{.FullCommit}}" 45 | - "--label=org.opencontainers.image.version={{.Version}}" 46 | - "--label=org.opencontainers.image.source=https://github.com/muesli/gitflux" 47 | - "--platform=linux/arm64" 48 | goarch: arm64 49 | docker_manifests: 50 | - name_template: 'ghcr.io/muesli/gitflux:{{ .Tag }}' 51 | image_templates: 52 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-amd64' 53 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-arm64' 54 | - name_template: 'ghcr.io/muesli/gitflux:latest' 55 | image_templates: 56 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-amd64' 57 | - 'ghcr.io/muesli/gitflux:{{ .Tag }}-arm64' 58 | -------------------------------------------------------------------------------- /Dockerfile.goreleaser: -------------------------------------------------------------------------------- 1 | FROM alpine 2 | COPY gitflux_*.apk /tmp/ 3 | RUN apk add --allow-untrusted /tmp/gitflux_*.apk 4 | ENTRYPOINT ["/usr/local/bin/gitflux"] 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Christian Muehlhaeuser 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # gitflux 2 | 3 | Track your GitHub projects in InfluxDB and create beautiful graphs with Grafana 4 | 5 | ## Features 6 | 7 | Lets you track these things: 8 | 9 | - Yourself 10 | - [x] Follower counts 11 | - [x] Notifications 12 | - Repositories 13 | - [x] Stars 14 | - [x] Forks 15 | - [x] Watchers 16 | - [x] Commits 17 | - Issues 18 | - [x] State 19 | - [x] Assignees 20 | - [x] Labels 21 | - PRs 22 | - [x] State 23 | - [x] Assignees 24 | - [x] Labels 25 | 26 | ## Usage 27 | 28 | Import statistics for all your source repositories: 29 | 30 | ``` 31 | $ gitflux repository 32 | Finding user's source repos... 33 | Found 83 repos 34 | Parsing muesli/gitflux 35 | Finding PRs for repo... 36 | Found 38 PRs! 37 | Finding issues for repo... 38 | Found 39 issues! 39 | Parsing muesli/duf 40 | ... 41 | ``` 42 | 43 | Import statistics for a specific repository: 44 | 45 | ``` 46 | $ gitflux repository muesli/gitflux 47 | Parsing muesli/gitflux 48 | Finding PRs for repo... 49 | Found 38 PRs! 50 | Finding issues for repo... 51 | Found 39 issues! 52 | ``` 53 | 54 | Import relationship statistics: 55 | 56 | ``` 57 | $ gitflux relationships 58 | Finding relationships for user... 59 | Found 1109 followers 60 | ``` 61 | 62 | Import notification statistics: 63 | 64 | ``` 65 | $ gitflux notifications 66 | Finding notifications for user... 67 | Found 14 unread notifications 68 | ``` 69 | 70 | ### Flags 71 | 72 | ``` 73 | --influx string InfluxDB address (default "http://localhost:8086") 74 | --influx-bucket string InfluxDB bucket (default "github") 75 | --influx-token string InfluxDB auth token 76 | ``` 77 | 78 | ## Screenshots 79 | 80 | ### Graphs about you 81 | 82 | ![followers](/screenshots/user_followers.png) 83 | ![notifications](/screenshots/user_notifications.png) 84 | 85 | ### Graphs about all your source repos 86 | 87 | ![stars](/screenshots/repo_stars.png) 88 | ![forks](/screenshots/repo_forks.png) 89 | ![watchers](/screenshots/repo_watchers.png) 90 | ![commits](/screenshots/repo_commits.png) 91 | ![issues](/screenshots/repo_issues.png) 92 | ![prs](/screenshots/repo_prs.png) 93 | 94 | ### Graphs about individual projects 95 | 96 | ![stars](/screenshots/project_stars.png) 97 | ![forks](/screenshots/project_forks.png) 98 | ![watchers](/screenshots/project_watchers.png) 99 | ![commits](/screenshots/project_commits.png) 100 | ![issues](/screenshots/project_issues.png) 101 | ![issue labels](/screenshots/project_issues_labels.png) 102 | ![issue bars](/screenshots/project_issues_labels_bars.png) 103 | ![prs](/screenshots/project_prs.png) 104 | ![pr labels](/screenshots/project_prs_labels.png) 105 | ![pr bars](/screenshots/project_prs_labels_bars.png) 106 | 107 | ## TODOs 108 | 109 | - Add a `docker-compose.yml` with the following services: 110 | - InfluxDB 111 | - Grafana 112 | - gitflux 113 | - More graphs? 114 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/muesli/gitflux 2 | 3 | go 1.15 4 | 5 | require ( 6 | github.com/google/go-github/v32 v32.1.0 7 | github.com/influxdata/influxdb-client-go/v2 v2.1.0 8 | github.com/mattn/go-isatty v0.0.12 // indirect 9 | github.com/shurcooL/githubv4 v0.0.0-20200928013246-d292edc3691b 10 | github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a // indirect 11 | github.com/spf13/cobra v1.1.1 12 | golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee // indirect 13 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 14 | golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb // indirect 15 | ) 16 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= 4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= 5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= 6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= 7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= 8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= 9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= 10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= 11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= 12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= 13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= 14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= 15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= 16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= 17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= 18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= 19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= 20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= 21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= 22 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= 23 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= 24 | cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 25 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= 26 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= 27 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= 28 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= 29 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= 30 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= 31 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= 32 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= 33 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= 34 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 35 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 36 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= 37 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= 38 | github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= 39 | github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= 40 | github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= 41 | github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= 42 | github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= 43 | github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= 44 | github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= 45 | github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= 46 | github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= 47 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 48 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= 49 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= 50 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= 51 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= 52 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 53 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= 54 | github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= 55 | github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= 56 | github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= 57 | github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 58 | github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= 59 | github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= 60 | github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= 61 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 62 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 63 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 64 | github.com/deepmap/oapi-codegen v1.3.6 h1:Wj44p9A0V0PJ+AUg0BWdyGcsS1LY18U+0rCuPQgK0+o= 65 | github.com/deepmap/oapi-codegen v1.3.6/go.mod h1:aBozjEveG+33xPiP55Iw/XbVkhtZHEGLq3nxlX0+hfU= 66 | github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= 67 | github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= 68 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 69 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 70 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= 71 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 72 | github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= 73 | github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= 74 | github.com/getkin/kin-openapi v0.2.0/go.mod h1:V1z9xl9oF5Wt7v32ne4FmiF1alpS4dM6mNzoywPOXlk= 75 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= 76 | github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= 77 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= 78 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 79 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= 80 | github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= 81 | github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= 82 | github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= 83 | github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= 84 | github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= 85 | github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= 86 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 87 | github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 88 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 89 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 90 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 91 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 92 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 93 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= 94 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 95 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 96 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= 97 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= 98 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 99 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 100 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 101 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 102 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= 103 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= 104 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 105 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 106 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 107 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 108 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 109 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 110 | github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= 111 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 112 | github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= 113 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 114 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= 115 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 116 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 117 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 118 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 119 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 120 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 121 | github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= 122 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 123 | github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= 124 | github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= 125 | github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= 126 | github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= 127 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= 128 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= 129 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 130 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= 131 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 132 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 133 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 134 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 135 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= 136 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 137 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= 138 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= 139 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= 140 | github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 141 | github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= 142 | github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= 143 | github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= 144 | github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= 145 | github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= 146 | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= 147 | github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= 148 | github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= 149 | github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= 150 | github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= 151 | github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 152 | github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= 153 | github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= 154 | github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 155 | github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= 156 | github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 157 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 158 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= 159 | github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= 160 | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= 161 | github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 162 | github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 163 | github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= 164 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= 165 | github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= 166 | github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= 167 | github.com/influxdata/influxdb-client-go/v2 v2.1.0 h1:zP2I/Vt+zHpF/8vtdkxI/qr25OgPPec3T6SPy6GesYY= 168 | github.com/influxdata/influxdb-client-go/v2 v2.1.0/go.mod h1:4m7g+qe8nHTRh+ptGHaR8FGB9yV3pxU93CKDb5bbTfY= 169 | github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU= 170 | github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= 171 | github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= 172 | github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= 173 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= 174 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= 175 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= 176 | github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= 177 | github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= 178 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= 179 | github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= 180 | github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= 181 | github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= 182 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= 183 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 184 | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= 185 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 186 | github.com/labstack/echo/v4 v4.1.11 h1:z0BZoArY4FqdpUEl+wlHp4hnr/oSR6MTmQmv8OHSoww= 187 | github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= 188 | github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= 189 | github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= 190 | github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= 191 | github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= 192 | github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= 193 | github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 194 | github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= 195 | github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= 196 | github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= 197 | github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= 198 | github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= 199 | github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= 200 | github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= 201 | github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= 202 | github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= 203 | github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= 204 | github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= 205 | github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 206 | github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 207 | github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= 208 | github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= 209 | github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 210 | github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 211 | github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= 212 | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= 213 | github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 214 | github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= 215 | github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= 216 | github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= 217 | github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= 218 | github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 219 | github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 220 | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= 221 | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= 222 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 223 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 224 | github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= 225 | github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= 226 | github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= 227 | github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= 228 | github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 229 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 230 | github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= 231 | github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= 232 | github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= 233 | github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= 234 | github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= 235 | github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= 236 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= 237 | github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 238 | github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= 239 | github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 240 | github.com/shurcooL/githubv4 v0.0.0-20200928013246-d292edc3691b h1:0/ecDXh/HTHRtSDSFnD2/Ta1yQ5J76ZspVY4u0/jGFk= 241 | github.com/shurcooL/githubv4 v0.0.0-20200928013246-d292edc3691b/go.mod h1:hAF0iLZy4td2EX+/8Tw+4nodhlMrwN3HupfaXj3zkGo= 242 | github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a h1:KikTa6HtAK8cS1qjvUvvq4QO21QnwC+EfvB+OAuZ/ZU= 243 | github.com/shurcooL/graphql v0.0.0-20200928012149-18c5c3165e3a/go.mod h1:AuYgA5Kyo4c7HfUmvRGs/6rGlMMV/6B1bVnB9JxJEEg= 244 | github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= 245 | github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= 246 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= 247 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= 248 | github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= 249 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= 250 | github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= 251 | github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= 252 | github.com/spf13/cobra v1.1.1 h1:KfztREH0tPxJJ+geloSLaAkaPkr4ki2Er5quFV1TDo4= 253 | github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= 254 | github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= 255 | github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= 256 | github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= 257 | github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 258 | github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= 259 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 260 | github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 261 | github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 262 | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 263 | github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= 264 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= 265 | github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= 266 | github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= 267 | github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= 268 | github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 269 | github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= 270 | github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= 271 | github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= 272 | github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= 273 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 274 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 275 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 276 | go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= 277 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= 278 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= 279 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 280 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 281 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= 282 | go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= 283 | go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= 284 | go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= 285 | golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 286 | golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= 287 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 288 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 289 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 290 | golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 291 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 292 | golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 293 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 294 | golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee h1:4yd7jl+vXjalO5ztz6Vc1VADv+S/80LGJmyl1ROJ2AI= 295 | golang.org/x/crypto v0.0.0-20201012173705-84dcc777aaee/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 296 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 297 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 298 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= 299 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= 300 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= 301 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 302 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 303 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= 304 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= 305 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= 306 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= 307 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= 308 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 309 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 310 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 311 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 312 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 313 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 314 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 315 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= 316 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 317 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 318 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 319 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= 320 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= 321 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= 322 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 323 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 324 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 325 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 326 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 327 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 328 | golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 329 | golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 330 | golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 331 | golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 332 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 333 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 334 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 335 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 336 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 337 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 338 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= 339 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 340 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 341 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 342 | golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 343 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 344 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 345 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 346 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 347 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 348 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 349 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 350 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 351 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 352 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 353 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= 354 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 355 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 356 | golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA= 357 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= 358 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 359 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 360 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 361 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 362 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= 363 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43 h1:ld7aEMNHoBnnDAX15v1T6z31v8HwR2A9FYOuAhWqkwc= 364 | golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= 365 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 366 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 367 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 368 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 369 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 370 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 371 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 372 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 373 | golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 374 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 375 | golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 376 | golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 377 | golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 378 | golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 379 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 380 | golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 381 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 382 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 383 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 384 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 385 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 386 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 387 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 388 | golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 389 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 390 | golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 391 | golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 392 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 393 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 394 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 395 | golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 396 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 397 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 398 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 399 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 400 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 401 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 402 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 403 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 404 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 405 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 406 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 407 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 408 | golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb h1:HS9IzC4UFbpMBLQUDSQcU+ViVT1vdFCQVjdPVpTlZrs= 409 | golang.org/x/sys v0.0.0-20201013132646-2da7054afaeb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 410 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 411 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 412 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 413 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= 414 | golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= 415 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 416 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 417 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 418 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= 419 | golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 420 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 421 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 422 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 423 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 424 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 425 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 426 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 427 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 428 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 429 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 430 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 431 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 432 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= 433 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 434 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 435 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 436 | golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 437 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 438 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 439 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 440 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 441 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 442 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 443 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 444 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 445 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 446 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 447 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 448 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 449 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 450 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 451 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 452 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 453 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= 454 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= 455 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 456 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 457 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 458 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= 459 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 460 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 461 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= 462 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 463 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 464 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 465 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 466 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 467 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= 468 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= 469 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 470 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= 471 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 472 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 473 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= 474 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 475 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 476 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 477 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 478 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= 479 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 480 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= 481 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= 482 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= 483 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 484 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 485 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 486 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= 487 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 488 | google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= 489 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= 490 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 491 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 492 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 493 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 494 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= 495 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 496 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 497 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= 498 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 499 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 500 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 501 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 502 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 503 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= 504 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= 505 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 506 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 507 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 508 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 509 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 510 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 511 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 512 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= 513 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= 514 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 515 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= 516 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 517 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 518 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= 519 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 520 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= 521 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= 522 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 523 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 524 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 525 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 526 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 527 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= 528 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= 529 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 530 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= 531 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 532 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 533 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 534 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 535 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 536 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 537 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 538 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 539 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= 540 | google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= 541 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 542 | gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= 543 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 544 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= 545 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 546 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= 547 | gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= 548 | gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= 549 | gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= 550 | gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 551 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 552 | gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 553 | gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 554 | gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= 555 | gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 556 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 557 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 558 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 559 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 560 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= 561 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 562 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= 563 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= 564 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= 565 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= 566 | -------------------------------------------------------------------------------- /grafana/dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ 3 | { 4 | "name": "DS_INFLUXDB_GITHUB", 5 | "label": "InfluxDB GitHub", 6 | "description": "", 7 | "type": "datasource", 8 | "pluginId": "influxdb", 9 | "pluginName": "InfluxDB" 10 | } 11 | ], 12 | "__requires": [ 13 | { 14 | "type": "grafana", 15 | "id": "grafana", 16 | "name": "Grafana", 17 | "version": "7.1.1" 18 | }, 19 | { 20 | "type": "panel", 21 | "id": "graph", 22 | "name": "Graph", 23 | "version": "" 24 | }, 25 | { 26 | "type": "datasource", 27 | "id": "influxdb", 28 | "name": "InfluxDB", 29 | "version": "1.0.0" 30 | } 31 | ], 32 | "annotations": { 33 | "list": [ 34 | { 35 | "builtIn": 1, 36 | "datasource": "-- Grafana --", 37 | "enable": true, 38 | "hide": true, 39 | "iconColor": "rgba(0, 211, 255, 1)", 40 | "name": "Annotations & Alerts", 41 | "type": "dashboard" 42 | } 43 | ] 44 | }, 45 | "editable": true, 46 | "gnetId": null, 47 | "graphTooltip": 0, 48 | "id": null, 49 | "links": [], 50 | "panels": [ 51 | { 52 | "aliasColors": { 53 | "followers": "semi-dark-red" 54 | }, 55 | "bars": false, 56 | "dashLength": 10, 57 | "dashes": false, 58 | "datasource": "${DS_INFLUXDB_GITHUB}", 59 | "decimals": 0, 60 | "description": "", 61 | "fieldConfig": { 62 | "defaults": { 63 | "custom": {} 64 | }, 65 | "overrides": [] 66 | }, 67 | "fill": 2, 68 | "fillGradient": 6, 69 | "gridPos": { 70 | "h": 11, 71 | "w": 12, 72 | "x": 0, 73 | "y": 0 74 | }, 75 | "hiddenSeries": false, 76 | "id": 7, 77 | "legend": { 78 | "alignAsTable": true, 79 | "avg": false, 80 | "current": true, 81 | "max": false, 82 | "min": false, 83 | "rightSide": false, 84 | "show": true, 85 | "total": false, 86 | "values": true 87 | }, 88 | "lines": true, 89 | "linewidth": 1, 90 | "nullPointMode": "null", 91 | "percentage": false, 92 | "pluginVersion": "7.1.1", 93 | "pointradius": 2, 94 | "points": false, 95 | "renderer": "flot", 96 | "seriesOverrides": [], 97 | "spaceLength": 10, 98 | "stack": false, 99 | "steppedLine": false, 100 | "targets": [ 101 | { 102 | "groupBy": [ 103 | { 104 | "params": [ 105 | "$__interval" 106 | ], 107 | "type": "time" 108 | }, 109 | { 110 | "params": [ 111 | "null" 112 | ], 113 | "type": "fill" 114 | } 115 | ], 116 | "orderByTime": "ASC", 117 | "policy": "default", 118 | "query": "SELECT \"value\" FROM \"followers\" WHERE $timeFilter fill(null)", 119 | "rawQuery": true, 120 | "refId": "A", 121 | "resultFormat": "time_series", 122 | "select": [ 123 | [ 124 | { 125 | "params": [ 126 | "value" 127 | ], 128 | "type": "field" 129 | }, 130 | { 131 | "params": [], 132 | "type": "mean" 133 | } 134 | ] 135 | ], 136 | "tags": [] 137 | } 138 | ], 139 | "thresholds": [], 140 | "timeFrom": null, 141 | "timeRegions": [], 142 | "timeShift": null, 143 | "title": "Followers", 144 | "tooltip": { 145 | "shared": true, 146 | "sort": 0, 147 | "value_type": "individual" 148 | }, 149 | "type": "graph", 150 | "xaxis": { 151 | "buckets": null, 152 | "mode": "time", 153 | "name": null, 154 | "show": true, 155 | "values": [] 156 | }, 157 | "yaxes": [ 158 | { 159 | "decimals": 0, 160 | "format": "none", 161 | "label": "", 162 | "logBase": 1, 163 | "max": null, 164 | "min": null, 165 | "show": true 166 | }, 167 | { 168 | "format": "short", 169 | "label": null, 170 | "logBase": 1, 171 | "max": null, 172 | "min": null, 173 | "show": true 174 | } 175 | ], 176 | "yaxis": { 177 | "align": false, 178 | "alignLevel": null 179 | } 180 | }, 181 | { 182 | "aliasColors": { 183 | "notifications": "light-blue" 184 | }, 185 | "bars": false, 186 | "dashLength": 10, 187 | "dashes": false, 188 | "datasource": "${DS_INFLUXDB_GITHUB}", 189 | "decimals": 0, 190 | "description": "", 191 | "fieldConfig": { 192 | "defaults": { 193 | "custom": {} 194 | }, 195 | "overrides": [] 196 | }, 197 | "fill": 2, 198 | "fillGradient": 6, 199 | "gridPos": { 200 | "h": 11, 201 | "w": 12, 202 | "x": 12, 203 | "y": 0 204 | }, 205 | "hiddenSeries": false, 206 | "id": 8, 207 | "legend": { 208 | "alignAsTable": true, 209 | "avg": false, 210 | "current": true, 211 | "max": false, 212 | "min": false, 213 | "show": true, 214 | "total": false, 215 | "values": true 216 | }, 217 | "lines": true, 218 | "linewidth": 1, 219 | "nullPointMode": "null", 220 | "percentage": false, 221 | "pluginVersion": "7.1.1", 222 | "pointradius": 2, 223 | "points": false, 224 | "renderer": "flot", 225 | "seriesOverrides": [], 226 | "spaceLength": 10, 227 | "stack": false, 228 | "steppedLine": false, 229 | "targets": [ 230 | { 231 | "groupBy": [ 232 | { 233 | "params": [ 234 | "$__interval" 235 | ], 236 | "type": "time" 237 | }, 238 | { 239 | "params": [ 240 | "null" 241 | ], 242 | "type": "fill" 243 | } 244 | ], 245 | "orderByTime": "ASC", 246 | "policy": "default", 247 | "query": "SELECT \"value\" FROM \"notifications\" WHERE $timeFilter fill(null)", 248 | "rawQuery": true, 249 | "refId": "A", 250 | "resultFormat": "time_series", 251 | "select": [ 252 | [ 253 | { 254 | "params": [ 255 | "value" 256 | ], 257 | "type": "field" 258 | }, 259 | { 260 | "params": [], 261 | "type": "mean" 262 | } 263 | ] 264 | ], 265 | "tags": [] 266 | } 267 | ], 268 | "thresholds": [], 269 | "timeFrom": null, 270 | "timeRegions": [], 271 | "timeShift": null, 272 | "title": "Notifications", 273 | "tooltip": { 274 | "shared": true, 275 | "sort": 0, 276 | "value_type": "individual" 277 | }, 278 | "type": "graph", 279 | "xaxis": { 280 | "buckets": null, 281 | "mode": "time", 282 | "name": null, 283 | "show": true, 284 | "values": [] 285 | }, 286 | "yaxes": [ 287 | { 288 | "decimals": 0, 289 | "format": "short", 290 | "label": "", 291 | "logBase": 1, 292 | "max": null, 293 | "min": null, 294 | "show": true 295 | }, 296 | { 297 | "format": "short", 298 | "label": null, 299 | "logBase": 1, 300 | "max": null, 301 | "min": null, 302 | "show": true 303 | } 304 | ], 305 | "yaxis": { 306 | "align": false, 307 | "alignLevel": null 308 | } 309 | }, 310 | { 311 | "aliasColors": {}, 312 | "bars": false, 313 | "dashLength": 10, 314 | "dashes": false, 315 | "datasource": "${DS_INFLUXDB_GITHUB}", 316 | "description": "", 317 | "fieldConfig": { 318 | "defaults": { 319 | "custom": {}, 320 | "links": [ 321 | { 322 | "targetBlank": true, 323 | "title": "Project Dashboard", 324 | "url": "http://192.168.11.1:3000/d/23NQ1c5Mj/github-project?orgId=1&var-repository=${__series.name}" 325 | } 326 | ] 327 | }, 328 | "overrides": [] 329 | }, 330 | "fill": 0, 331 | "fillGradient": 0, 332 | "gridPos": { 333 | "h": 18, 334 | "w": 12, 335 | "x": 0, 336 | "y": 11 337 | }, 338 | "hiddenSeries": false, 339 | "id": 12, 340 | "legend": { 341 | "alignAsTable": true, 342 | "avg": false, 343 | "current": true, 344 | "max": false, 345 | "min": false, 346 | "rightSide": true, 347 | "show": true, 348 | "total": false, 349 | "values": true 350 | }, 351 | "lines": true, 352 | "linewidth": 1, 353 | "links": [], 354 | "nullPointMode": "null", 355 | "percentage": false, 356 | "pluginVersion": "7.1.1", 357 | "pointradius": 2, 358 | "points": false, 359 | "renderer": "flot", 360 | "seriesOverrides": [], 361 | "spaceLength": 10, 362 | "stack": false, 363 | "steppedLine": false, 364 | "targets": [ 365 | { 366 | "alias": "$tag_repo", 367 | "groupBy": [ 368 | { 369 | "params": [ 370 | "$__interval" 371 | ], 372 | "type": "time" 373 | }, 374 | { 375 | "params": [ 376 | "null" 377 | ], 378 | "type": "fill" 379 | } 380 | ], 381 | "measurement": "github", 382 | "orderByTime": "ASC", 383 | "policy": "stars", 384 | "query": "SELECT \"value\" FROM \"stars\" WHERE value > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 385 | "rawQuery": true, 386 | "refId": "A", 387 | "resultFormat": "time_series", 388 | "select": [ 389 | [ 390 | { 391 | "params": [ 392 | "value" 393 | ], 394 | "type": "field" 395 | }, 396 | { 397 | "params": [], 398 | "type": "mean" 399 | } 400 | ] 401 | ], 402 | "tags": [] 403 | } 404 | ], 405 | "thresholds": [], 406 | "timeFrom": null, 407 | "timeRegions": [], 408 | "timeShift": null, 409 | "title": "Stars", 410 | "tooltip": { 411 | "shared": true, 412 | "sort": 2, 413 | "value_type": "individual" 414 | }, 415 | "type": "graph", 416 | "xaxis": { 417 | "buckets": null, 418 | "mode": "time", 419 | "name": null, 420 | "show": true, 421 | "values": [] 422 | }, 423 | "yaxes": [ 424 | { 425 | "format": "short", 426 | "label": null, 427 | "logBase": 2, 428 | "max": null, 429 | "min": null, 430 | "show": true 431 | }, 432 | { 433 | "format": "short", 434 | "label": null, 435 | "logBase": 1, 436 | "max": null, 437 | "min": null, 438 | "show": true 439 | } 440 | ], 441 | "yaxis": { 442 | "align": false, 443 | "alignLevel": null 444 | } 445 | }, 446 | { 447 | "aliasColors": {}, 448 | "bars": false, 449 | "dashLength": 10, 450 | "dashes": false, 451 | "datasource": "${DS_INFLUXDB_GITHUB}", 452 | "description": "", 453 | "fieldConfig": { 454 | "defaults": { 455 | "custom": {} 456 | }, 457 | "overrides": [] 458 | }, 459 | "fill": 0, 460 | "fillGradient": 0, 461 | "gridPos": { 462 | "h": 18, 463 | "w": 12, 464 | "x": 12, 465 | "y": 11 466 | }, 467 | "hiddenSeries": false, 468 | "id": 5, 469 | "legend": { 470 | "alignAsTable": true, 471 | "avg": false, 472 | "current": true, 473 | "max": false, 474 | "min": false, 475 | "rightSide": true, 476 | "show": true, 477 | "total": false, 478 | "values": true 479 | }, 480 | "lines": true, 481 | "linewidth": 1, 482 | "nullPointMode": "null", 483 | "percentage": false, 484 | "pluginVersion": "7.1.1", 485 | "pointradius": 2, 486 | "points": false, 487 | "renderer": "flot", 488 | "seriesOverrides": [], 489 | "spaceLength": 10, 490 | "stack": false, 491 | "steppedLine": false, 492 | "targets": [ 493 | { 494 | "alias": "$tag_repo", 495 | "groupBy": [ 496 | { 497 | "params": [ 498 | "$__interval" 499 | ], 500 | "type": "time" 501 | }, 502 | { 503 | "params": [ 504 | "null" 505 | ], 506 | "type": "fill" 507 | } 508 | ], 509 | "orderByTime": "ASC", 510 | "policy": "default", 511 | "query": "SELECT \"value\" FROM \"commits\" WHERE value > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 512 | "rawQuery": true, 513 | "refId": "A", 514 | "resultFormat": "time_series", 515 | "select": [ 516 | [ 517 | { 518 | "params": [ 519 | "value" 520 | ], 521 | "type": "field" 522 | }, 523 | { 524 | "params": [], 525 | "type": "mean" 526 | } 527 | ] 528 | ], 529 | "tags": [] 530 | } 531 | ], 532 | "thresholds": [], 533 | "timeFrom": null, 534 | "timeRegions": [], 535 | "timeShift": null, 536 | "title": "Commits", 537 | "tooltip": { 538 | "shared": true, 539 | "sort": 2, 540 | "value_type": "individual" 541 | }, 542 | "type": "graph", 543 | "xaxis": { 544 | "buckets": null, 545 | "mode": "time", 546 | "name": null, 547 | "show": true, 548 | "values": [] 549 | }, 550 | "yaxes": [ 551 | { 552 | "format": "short", 553 | "label": null, 554 | "logBase": 2, 555 | "max": null, 556 | "min": null, 557 | "show": true 558 | }, 559 | { 560 | "format": "short", 561 | "label": null, 562 | "logBase": 1, 563 | "max": null, 564 | "min": null, 565 | "show": true 566 | } 567 | ], 568 | "yaxis": { 569 | "align": false, 570 | "alignLevel": null 571 | } 572 | }, 573 | { 574 | "aliasColors": {}, 575 | "bars": false, 576 | "dashLength": 10, 577 | "dashes": false, 578 | "datasource": "${DS_INFLUXDB_GITHUB}", 579 | "description": "", 580 | "fieldConfig": { 581 | "defaults": { 582 | "custom": {} 583 | }, 584 | "overrides": [] 585 | }, 586 | "fill": 0, 587 | "fillGradient": 0, 588 | "gridPos": { 589 | "h": 20, 590 | "w": 12, 591 | "x": 0, 592 | "y": 29 593 | }, 594 | "hiddenSeries": false, 595 | "id": 3, 596 | "legend": { 597 | "alignAsTable": true, 598 | "avg": false, 599 | "current": true, 600 | "max": false, 601 | "min": false, 602 | "rightSide": true, 603 | "show": true, 604 | "total": false, 605 | "values": true 606 | }, 607 | "lines": true, 608 | "linewidth": 1, 609 | "nullPointMode": "null", 610 | "percentage": false, 611 | "pluginVersion": "7.1.1", 612 | "pointradius": 2, 613 | "points": false, 614 | "renderer": "flot", 615 | "seriesOverrides": [], 616 | "spaceLength": 10, 617 | "stack": false, 618 | "steppedLine": false, 619 | "targets": [ 620 | { 621 | "alias": "$tag_repo", 622 | "groupBy": [ 623 | { 624 | "params": [ 625 | "$__interval" 626 | ], 627 | "type": "time" 628 | }, 629 | { 630 | "params": [ 631 | "null" 632 | ], 633 | "type": "fill" 634 | } 635 | ], 636 | "measurement": "github", 637 | "orderByTime": "ASC", 638 | "policy": "stars", 639 | "query": "SELECT \"value\" FROM \"forks\" WHERE value > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 640 | "rawQuery": true, 641 | "refId": "A", 642 | "resultFormat": "time_series", 643 | "select": [ 644 | [ 645 | { 646 | "params": [ 647 | "value" 648 | ], 649 | "type": "field" 650 | }, 651 | { 652 | "params": [], 653 | "type": "mean" 654 | } 655 | ] 656 | ], 657 | "tags": [] 658 | } 659 | ], 660 | "thresholds": [], 661 | "timeFrom": null, 662 | "timeRegions": [], 663 | "timeShift": null, 664 | "title": "Forks", 665 | "tooltip": { 666 | "shared": true, 667 | "sort": 2, 668 | "value_type": "individual" 669 | }, 670 | "type": "graph", 671 | "xaxis": { 672 | "buckets": null, 673 | "mode": "time", 674 | "name": null, 675 | "show": true, 676 | "values": [] 677 | }, 678 | "yaxes": [ 679 | { 680 | "format": "short", 681 | "label": null, 682 | "logBase": 2, 683 | "max": null, 684 | "min": null, 685 | "show": true 686 | }, 687 | { 688 | "format": "short", 689 | "label": null, 690 | "logBase": 1, 691 | "max": null, 692 | "min": null, 693 | "show": true 694 | } 695 | ], 696 | "yaxis": { 697 | "align": false, 698 | "alignLevel": null 699 | } 700 | }, 701 | { 702 | "aliasColors": {}, 703 | "bars": false, 704 | "dashLength": 10, 705 | "dashes": false, 706 | "datasource": "${DS_INFLUXDB_GITHUB}", 707 | "description": "", 708 | "fieldConfig": { 709 | "defaults": { 710 | "custom": {} 711 | }, 712 | "overrides": [] 713 | }, 714 | "fill": 0, 715 | "fillGradient": 0, 716 | "gridPos": { 717 | "h": 20, 718 | "w": 12, 719 | "x": 12, 720 | "y": 29 721 | }, 722 | "hiddenSeries": false, 723 | "id": 9, 724 | "legend": { 725 | "alignAsTable": true, 726 | "avg": false, 727 | "current": true, 728 | "max": false, 729 | "min": false, 730 | "rightSide": true, 731 | "show": true, 732 | "total": false, 733 | "values": true 734 | }, 735 | "lines": true, 736 | "linewidth": 1, 737 | "nullPointMode": "null", 738 | "percentage": false, 739 | "pluginVersion": "7.1.1", 740 | "pointradius": 2, 741 | "points": false, 742 | "renderer": "flot", 743 | "seriesOverrides": [], 744 | "spaceLength": 10, 745 | "stack": false, 746 | "steppedLine": false, 747 | "targets": [ 748 | { 749 | "alias": "$tag_repo", 750 | "groupBy": [ 751 | { 752 | "params": [ 753 | "$__interval" 754 | ], 755 | "type": "time" 756 | }, 757 | { 758 | "params": [ 759 | "null" 760 | ], 761 | "type": "fill" 762 | } 763 | ], 764 | "measurement": "github", 765 | "orderByTime": "ASC", 766 | "policy": "stars", 767 | "query": "SELECT \"value\" FROM \"watchers\" WHERE value > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 768 | "rawQuery": true, 769 | "refId": "A", 770 | "resultFormat": "time_series", 771 | "select": [ 772 | [ 773 | { 774 | "params": [ 775 | "value" 776 | ], 777 | "type": "field" 778 | }, 779 | { 780 | "params": [], 781 | "type": "mean" 782 | } 783 | ] 784 | ], 785 | "tags": [] 786 | } 787 | ], 788 | "thresholds": [], 789 | "timeFrom": null, 790 | "timeRegions": [], 791 | "timeShift": null, 792 | "title": "Watchers", 793 | "tooltip": { 794 | "shared": true, 795 | "sort": 2, 796 | "value_type": "individual" 797 | }, 798 | "type": "graph", 799 | "xaxis": { 800 | "buckets": null, 801 | "mode": "time", 802 | "name": null, 803 | "show": true, 804 | "values": [] 805 | }, 806 | "yaxes": [ 807 | { 808 | "format": "short", 809 | "label": null, 810 | "logBase": 2, 811 | "max": null, 812 | "min": null, 813 | "show": true 814 | }, 815 | { 816 | "format": "short", 817 | "label": null, 818 | "logBase": 1, 819 | "max": null, 820 | "min": null, 821 | "show": true 822 | } 823 | ], 824 | "yaxis": { 825 | "align": false, 826 | "alignLevel": null 827 | } 828 | }, 829 | { 830 | "aliasColors": {}, 831 | "bars": false, 832 | "dashLength": 10, 833 | "dashes": false, 834 | "datasource": "${DS_INFLUXDB_GITHUB}", 835 | "decimals": 0, 836 | "description": "", 837 | "fieldConfig": { 838 | "defaults": { 839 | "custom": {} 840 | }, 841 | "overrides": [] 842 | }, 843 | "fill": 0, 844 | "fillGradient": 0, 845 | "gridPos": { 846 | "h": 23, 847 | "w": 12, 848 | "x": 0, 849 | "y": 49 850 | }, 851 | "hiddenSeries": false, 852 | "id": 11, 853 | "legend": { 854 | "alignAsTable": true, 855 | "avg": false, 856 | "current": true, 857 | "max": false, 858 | "min": false, 859 | "rightSide": true, 860 | "show": true, 861 | "total": false, 862 | "values": true 863 | }, 864 | "lines": true, 865 | "linewidth": 1, 866 | "nullPointMode": "null", 867 | "percentage": false, 868 | "pluginVersion": "7.1.1", 869 | "pointradius": 2, 870 | "points": false, 871 | "renderer": "flot", 872 | "seriesOverrides": [], 873 | "spaceLength": 10, 874 | "stack": false, 875 | "steppedLine": false, 876 | "targets": [ 877 | { 878 | "alias": "$tag_repo", 879 | "groupBy": [ 880 | { 881 | "params": [ 882 | "$__interval" 883 | ], 884 | "type": "time" 885 | }, 886 | { 887 | "params": [ 888 | "null" 889 | ], 890 | "type": "fill" 891 | } 892 | ], 893 | "orderByTime": "ASC", 894 | "policy": "default", 895 | "query": "SELECT \"total\" FROM \"issues\" WHERE total > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 896 | "rawQuery": true, 897 | "refId": "A", 898 | "resultFormat": "time_series", 899 | "select": [ 900 | [ 901 | { 902 | "params": [ 903 | "value" 904 | ], 905 | "type": "field" 906 | }, 907 | { 908 | "params": [], 909 | "type": "mean" 910 | } 911 | ] 912 | ], 913 | "tags": [] 914 | } 915 | ], 916 | "thresholds": [], 917 | "timeFrom": null, 918 | "timeRegions": [], 919 | "timeShift": null, 920 | "title": "Issues", 921 | "tooltip": { 922 | "shared": true, 923 | "sort": 2, 924 | "value_type": "individual" 925 | }, 926 | "type": "graph", 927 | "xaxis": { 928 | "buckets": null, 929 | "mode": "time", 930 | "name": null, 931 | "show": true, 932 | "values": [] 933 | }, 934 | "yaxes": [ 935 | { 936 | "decimals": 0, 937 | "format": "short", 938 | "label": null, 939 | "logBase": 1, 940 | "max": null, 941 | "min": null, 942 | "show": true 943 | }, 944 | { 945 | "format": "short", 946 | "label": null, 947 | "logBase": 1, 948 | "max": null, 949 | "min": null, 950 | "show": true 951 | } 952 | ], 953 | "yaxis": { 954 | "align": false, 955 | "alignLevel": null 956 | } 957 | }, 958 | { 959 | "aliasColors": {}, 960 | "bars": false, 961 | "dashLength": 10, 962 | "dashes": false, 963 | "datasource": "${DS_INFLUXDB_GITHUB}", 964 | "decimals": 0, 965 | "description": "", 966 | "fieldConfig": { 967 | "defaults": { 968 | "custom": {} 969 | }, 970 | "overrides": [] 971 | }, 972 | "fill": 0, 973 | "fillGradient": 0, 974 | "gridPos": { 975 | "h": 23, 976 | "w": 12, 977 | "x": 12, 978 | "y": 49 979 | }, 980 | "hiddenSeries": false, 981 | "id": 10, 982 | "legend": { 983 | "alignAsTable": true, 984 | "avg": false, 985 | "current": true, 986 | "max": false, 987 | "min": false, 988 | "rightSide": true, 989 | "show": true, 990 | "total": false, 991 | "values": true 992 | }, 993 | "lines": true, 994 | "linewidth": 1, 995 | "nullPointMode": "null", 996 | "percentage": false, 997 | "pluginVersion": "7.1.1", 998 | "pointradius": 2, 999 | "points": false, 1000 | "renderer": "flot", 1001 | "seriesOverrides": [], 1002 | "spaceLength": 10, 1003 | "stack": false, 1004 | "steppedLine": false, 1005 | "targets": [ 1006 | { 1007 | "alias": "$tag_repo", 1008 | "groupBy": [ 1009 | { 1010 | "params": [ 1011 | "$__interval" 1012 | ], 1013 | "type": "time" 1014 | }, 1015 | { 1016 | "params": [ 1017 | "null" 1018 | ], 1019 | "type": "fill" 1020 | } 1021 | ], 1022 | "orderByTime": "ASC", 1023 | "policy": "default", 1024 | "query": "SELECT \"open\" FROM \"issues\" WHERE open > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 1025 | "rawQuery": true, 1026 | "refId": "A", 1027 | "resultFormat": "time_series", 1028 | "select": [ 1029 | [ 1030 | { 1031 | "params": [ 1032 | "value" 1033 | ], 1034 | "type": "field" 1035 | }, 1036 | { 1037 | "params": [], 1038 | "type": "mean" 1039 | } 1040 | ] 1041 | ], 1042 | "tags": [] 1043 | } 1044 | ], 1045 | "thresholds": [], 1046 | "timeFrom": null, 1047 | "timeRegions": [], 1048 | "timeShift": null, 1049 | "title": "Open Issues", 1050 | "tooltip": { 1051 | "shared": true, 1052 | "sort": 2, 1053 | "value_type": "individual" 1054 | }, 1055 | "type": "graph", 1056 | "xaxis": { 1057 | "buckets": null, 1058 | "mode": "time", 1059 | "name": null, 1060 | "show": true, 1061 | "values": [] 1062 | }, 1063 | "yaxes": [ 1064 | { 1065 | "decimals": 0, 1066 | "format": "short", 1067 | "label": null, 1068 | "logBase": 1, 1069 | "max": null, 1070 | "min": null, 1071 | "show": true 1072 | }, 1073 | { 1074 | "format": "short", 1075 | "label": null, 1076 | "logBase": 1, 1077 | "max": null, 1078 | "min": null, 1079 | "show": true 1080 | } 1081 | ], 1082 | "yaxis": { 1083 | "align": false, 1084 | "alignLevel": null 1085 | } 1086 | }, 1087 | { 1088 | "aliasColors": {}, 1089 | "bars": false, 1090 | "dashLength": 10, 1091 | "dashes": false, 1092 | "datasource": "${DS_INFLUXDB_GITHUB}", 1093 | "decimals": 0, 1094 | "description": "", 1095 | "fieldConfig": { 1096 | "defaults": { 1097 | "custom": {} 1098 | }, 1099 | "overrides": [] 1100 | }, 1101 | "fill": 0, 1102 | "fillGradient": 0, 1103 | "gridPos": { 1104 | "h": 21, 1105 | "w": 12, 1106 | "x": 0, 1107 | "y": 72 1108 | }, 1109 | "hiddenSeries": false, 1110 | "id": 13, 1111 | "legend": { 1112 | "alignAsTable": true, 1113 | "avg": false, 1114 | "current": true, 1115 | "max": false, 1116 | "min": false, 1117 | "rightSide": true, 1118 | "show": true, 1119 | "total": false, 1120 | "values": true 1121 | }, 1122 | "lines": true, 1123 | "linewidth": 1, 1124 | "nullPointMode": "null", 1125 | "percentage": false, 1126 | "pluginVersion": "7.1.1", 1127 | "pointradius": 2, 1128 | "points": false, 1129 | "renderer": "flot", 1130 | "seriesOverrides": [], 1131 | "spaceLength": 10, 1132 | "stack": false, 1133 | "steppedLine": false, 1134 | "targets": [ 1135 | { 1136 | "alias": "$tag_repo", 1137 | "groupBy": [ 1138 | { 1139 | "params": [ 1140 | "$__interval" 1141 | ], 1142 | "type": "time" 1143 | }, 1144 | { 1145 | "params": [ 1146 | "null" 1147 | ], 1148 | "type": "fill" 1149 | } 1150 | ], 1151 | "orderByTime": "ASC", 1152 | "policy": "default", 1153 | "query": "SELECT \"total\" FROM \"pullrequests\" WHERE total > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 1154 | "rawQuery": true, 1155 | "refId": "A", 1156 | "resultFormat": "time_series", 1157 | "select": [ 1158 | [ 1159 | { 1160 | "params": [ 1161 | "value" 1162 | ], 1163 | "type": "field" 1164 | }, 1165 | { 1166 | "params": [], 1167 | "type": "mean" 1168 | } 1169 | ] 1170 | ], 1171 | "tags": [] 1172 | } 1173 | ], 1174 | "thresholds": [], 1175 | "timeFrom": null, 1176 | "timeRegions": [], 1177 | "timeShift": null, 1178 | "title": "Pull Requests", 1179 | "tooltip": { 1180 | "shared": true, 1181 | "sort": 2, 1182 | "value_type": "individual" 1183 | }, 1184 | "type": "graph", 1185 | "xaxis": { 1186 | "buckets": null, 1187 | "mode": "time", 1188 | "name": null, 1189 | "show": true, 1190 | "values": [] 1191 | }, 1192 | "yaxes": [ 1193 | { 1194 | "decimals": 0, 1195 | "format": "short", 1196 | "label": null, 1197 | "logBase": 1, 1198 | "max": null, 1199 | "min": null, 1200 | "show": true 1201 | }, 1202 | { 1203 | "format": "short", 1204 | "label": null, 1205 | "logBase": 1, 1206 | "max": null, 1207 | "min": null, 1208 | "show": true 1209 | } 1210 | ], 1211 | "yaxis": { 1212 | "align": false, 1213 | "alignLevel": null 1214 | } 1215 | }, 1216 | { 1217 | "aliasColors": {}, 1218 | "bars": false, 1219 | "dashLength": 10, 1220 | "dashes": false, 1221 | "datasource": "${DS_INFLUXDB_GITHUB}", 1222 | "decimals": 0, 1223 | "description": "", 1224 | "fieldConfig": { 1225 | "defaults": { 1226 | "custom": {} 1227 | }, 1228 | "overrides": [] 1229 | }, 1230 | "fill": 0, 1231 | "fillGradient": 0, 1232 | "gridPos": { 1233 | "h": 21, 1234 | "w": 12, 1235 | "x": 12, 1236 | "y": 72 1237 | }, 1238 | "hiddenSeries": false, 1239 | "id": 14, 1240 | "legend": { 1241 | "alignAsTable": true, 1242 | "avg": false, 1243 | "current": true, 1244 | "max": false, 1245 | "min": false, 1246 | "rightSide": true, 1247 | "show": true, 1248 | "total": false, 1249 | "values": true 1250 | }, 1251 | "lines": true, 1252 | "linewidth": 1, 1253 | "nullPointMode": "null", 1254 | "percentage": false, 1255 | "pluginVersion": "7.1.1", 1256 | "pointradius": 2, 1257 | "points": false, 1258 | "renderer": "flot", 1259 | "seriesOverrides": [], 1260 | "spaceLength": 10, 1261 | "stack": false, 1262 | "steppedLine": false, 1263 | "targets": [ 1264 | { 1265 | "alias": "$tag_repo", 1266 | "groupBy": [ 1267 | { 1268 | "params": [ 1269 | "$__interval" 1270 | ], 1271 | "type": "time" 1272 | }, 1273 | { 1274 | "params": [ 1275 | "null" 1276 | ], 1277 | "type": "fill" 1278 | } 1279 | ], 1280 | "orderByTime": "ASC", 1281 | "policy": "default", 1282 | "query": "SELECT \"open\" FROM \"pullrequests\" WHERE total > 0 AND $timeFilter GROUP BY \"repo\" fill(null)", 1283 | "rawQuery": true, 1284 | "refId": "A", 1285 | "resultFormat": "time_series", 1286 | "select": [ 1287 | [ 1288 | { 1289 | "params": [ 1290 | "value" 1291 | ], 1292 | "type": "field" 1293 | }, 1294 | { 1295 | "params": [], 1296 | "type": "mean" 1297 | } 1298 | ] 1299 | ], 1300 | "tags": [] 1301 | } 1302 | ], 1303 | "thresholds": [], 1304 | "timeFrom": null, 1305 | "timeRegions": [], 1306 | "timeShift": null, 1307 | "title": "Open Pull Requests", 1308 | "tooltip": { 1309 | "shared": true, 1310 | "sort": 2, 1311 | "value_type": "individual" 1312 | }, 1313 | "type": "graph", 1314 | "xaxis": { 1315 | "buckets": null, 1316 | "mode": "time", 1317 | "name": null, 1318 | "show": true, 1319 | "values": [] 1320 | }, 1321 | "yaxes": [ 1322 | { 1323 | "decimals": 0, 1324 | "format": "short", 1325 | "label": null, 1326 | "logBase": 1, 1327 | "max": null, 1328 | "min": null, 1329 | "show": true 1330 | }, 1331 | { 1332 | "format": "short", 1333 | "label": null, 1334 | "logBase": 1, 1335 | "max": null, 1336 | "min": null, 1337 | "show": true 1338 | } 1339 | ], 1340 | "yaxis": { 1341 | "align": false, 1342 | "alignLevel": null 1343 | } 1344 | } 1345 | ], 1346 | "refresh": "5m", 1347 | "schemaVersion": 26, 1348 | "style": "dark", 1349 | "tags": [], 1350 | "templating": { 1351 | "list": [] 1352 | }, 1353 | "time": { 1354 | "from": "now-14d", 1355 | "to": "now" 1356 | }, 1357 | "timepicker": { 1358 | "refresh_intervals": [ 1359 | "10s", 1360 | "30s", 1361 | "1m", 1362 | "5m", 1363 | "15m", 1364 | "30m", 1365 | "1h", 1366 | "2h", 1367 | "1d" 1368 | ] 1369 | }, 1370 | "timezone": "", 1371 | "title": "GitHub Dashboard", 1372 | "uid": "71nb1c5ak", 1373 | "version": 1 1374 | } 1375 | -------------------------------------------------------------------------------- /grafana/project_dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "__inputs": [ 3 | { 4 | "name": "DS_INFLUXDB_GITHUB", 5 | "label": "InfluxDB GitHub", 6 | "description": "", 7 | "type": "datasource", 8 | "pluginId": "influxdb", 9 | "pluginName": "InfluxDB" 10 | }, 11 | { 12 | "name": "DS_INFLUXDB", 13 | "label": "InfluxDB", 14 | "description": "", 15 | "type": "datasource", 16 | "pluginId": "influxdb", 17 | "pluginName": "InfluxDB" 18 | } 19 | ], 20 | "__requires": [ 21 | { 22 | "type": "grafana", 23 | "id": "grafana", 24 | "name": "Grafana", 25 | "version": "7.1.1" 26 | }, 27 | { 28 | "type": "panel", 29 | "id": "graph", 30 | "name": "Graph", 31 | "version": "" 32 | }, 33 | { 34 | "type": "datasource", 35 | "id": "influxdb", 36 | "name": "InfluxDB", 37 | "version": "1.0.0" 38 | } 39 | ], 40 | "annotations": { 41 | "list": [ 42 | { 43 | "builtIn": 1, 44 | "datasource": "-- Grafana --", 45 | "enable": true, 46 | "hide": true, 47 | "iconColor": "rgba(0, 211, 255, 1)", 48 | "name": "Annotations & Alerts", 49 | "type": "dashboard" 50 | } 51 | ] 52 | }, 53 | "editable": true, 54 | "gnetId": null, 55 | "graphTooltip": 0, 56 | "id": null, 57 | "iteration": 1603714883177, 58 | "links": [], 59 | "panels": [ 60 | { 61 | "collapsed": false, 62 | "datasource": "${DS_INFLUXDB}", 63 | "gridPos": { 64 | "h": 1, 65 | "w": 24, 66 | "x": 0, 67 | "y": 0 68 | }, 69 | "id": 32, 70 | "panels": [], 71 | "title": "Repository", 72 | "type": "row" 73 | }, 74 | { 75 | "aliasColors": { 76 | "Stars": "light-yellow" 77 | }, 78 | "bars": false, 79 | "dashLength": 10, 80 | "dashes": false, 81 | "datasource": "${DS_INFLUXDB_GITHUB}", 82 | "decimals": 0, 83 | "description": "", 84 | "fieldConfig": { 85 | "defaults": { 86 | "custom": {} 87 | }, 88 | "overrides": [] 89 | }, 90 | "fill": 2, 91 | "fillGradient": 6, 92 | "gridPos": { 93 | "h": 12, 94 | "w": 9, 95 | "x": 0, 96 | "y": 1 97 | }, 98 | "hiddenSeries": false, 99 | "id": 2, 100 | "legend": { 101 | "alignAsTable": true, 102 | "avg": false, 103 | "current": true, 104 | "max": false, 105 | "min": false, 106 | "rightSide": true, 107 | "show": true, 108 | "total": false, 109 | "values": true 110 | }, 111 | "lines": true, 112 | "linewidth": 1, 113 | "nullPointMode": "null", 114 | "percentage": false, 115 | "pluginVersion": "7.1.1", 116 | "pointradius": 2, 117 | "points": false, 118 | "renderer": "flot", 119 | "seriesOverrides": [], 120 | "spaceLength": 10, 121 | "stack": false, 122 | "steppedLine": false, 123 | "targets": [ 124 | { 125 | "alias": "Stars", 126 | "groupBy": [ 127 | { 128 | "params": [ 129 | "$__interval" 130 | ], 131 | "type": "time" 132 | }, 133 | { 134 | "params": [ 135 | "null" 136 | ], 137 | "type": "fill" 138 | } 139 | ], 140 | "measurement": "github", 141 | "orderByTime": "ASC", 142 | "policy": "stars", 143 | "query": "SELECT \"value\" FROM \"stars\" WHERE repo = '$repository' AND $timeFilter fill(null)", 144 | "rawQuery": true, 145 | "refId": "A", 146 | "resultFormat": "time_series", 147 | "select": [ 148 | [ 149 | { 150 | "params": [ 151 | "value" 152 | ], 153 | "type": "field" 154 | }, 155 | { 156 | "params": [], 157 | "type": "mean" 158 | } 159 | ] 160 | ], 161 | "tags": [] 162 | } 163 | ], 164 | "thresholds": [], 165 | "timeFrom": null, 166 | "timeRegions": [], 167 | "timeShift": null, 168 | "title": "Stars", 169 | "tooltip": { 170 | "shared": true, 171 | "sort": 2, 172 | "value_type": "individual" 173 | }, 174 | "type": "graph", 175 | "xaxis": { 176 | "buckets": null, 177 | "mode": "time", 178 | "name": null, 179 | "show": true, 180 | "values": [] 181 | }, 182 | "yaxes": [ 183 | { 184 | "decimals": -1, 185 | "format": "none", 186 | "label": null, 187 | "logBase": 1, 188 | "max": null, 189 | "min": null, 190 | "show": true 191 | }, 192 | { 193 | "format": "short", 194 | "label": null, 195 | "logBase": 1, 196 | "max": null, 197 | "min": null, 198 | "show": true 199 | } 200 | ], 201 | "yaxis": { 202 | "align": false, 203 | "alignLevel": null 204 | } 205 | }, 206 | { 207 | "aliasColors": { 208 | "Foks": "light-blue" 209 | }, 210 | "bars": false, 211 | "dashLength": 10, 212 | "dashes": false, 213 | "datasource": "${DS_INFLUXDB_GITHUB}", 214 | "decimals": 0, 215 | "description": "", 216 | "fieldConfig": { 217 | "defaults": { 218 | "custom": {} 219 | }, 220 | "overrides": [] 221 | }, 222 | "fill": 2, 223 | "fillGradient": 6, 224 | "gridPos": { 225 | "h": 12, 226 | "w": 8, 227 | "x": 9, 228 | "y": 1 229 | }, 230 | "hiddenSeries": false, 231 | "id": 3, 232 | "legend": { 233 | "alignAsTable": true, 234 | "avg": false, 235 | "current": true, 236 | "max": false, 237 | "min": false, 238 | "rightSide": true, 239 | "show": true, 240 | "total": false, 241 | "values": true 242 | }, 243 | "lines": true, 244 | "linewidth": 1, 245 | "nullPointMode": "null", 246 | "percentage": false, 247 | "pluginVersion": "7.1.1", 248 | "pointradius": 2, 249 | "points": false, 250 | "renderer": "flot", 251 | "seriesOverrides": [], 252 | "spaceLength": 10, 253 | "stack": false, 254 | "steppedLine": false, 255 | "targets": [ 256 | { 257 | "alias": "Foks", 258 | "groupBy": [ 259 | { 260 | "params": [ 261 | "$__interval" 262 | ], 263 | "type": "time" 264 | }, 265 | { 266 | "params": [ 267 | "null" 268 | ], 269 | "type": "fill" 270 | } 271 | ], 272 | "measurement": "github", 273 | "orderByTime": "ASC", 274 | "policy": "stars", 275 | "query": "SELECT \"value\" FROM \"forks\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 276 | "rawQuery": true, 277 | "refId": "A", 278 | "resultFormat": "time_series", 279 | "select": [ 280 | [ 281 | { 282 | "params": [ 283 | "value" 284 | ], 285 | "type": "field" 286 | }, 287 | { 288 | "params": [], 289 | "type": "mean" 290 | } 291 | ] 292 | ], 293 | "tags": [] 294 | } 295 | ], 296 | "thresholds": [], 297 | "timeFrom": null, 298 | "timeRegions": [], 299 | "timeShift": null, 300 | "title": "Forks", 301 | "tooltip": { 302 | "shared": true, 303 | "sort": 2, 304 | "value_type": "individual" 305 | }, 306 | "type": "graph", 307 | "xaxis": { 308 | "buckets": null, 309 | "mode": "time", 310 | "name": null, 311 | "show": true, 312 | "values": [] 313 | }, 314 | "yaxes": [ 315 | { 316 | "decimals": 0, 317 | "format": "none", 318 | "label": null, 319 | "logBase": 1, 320 | "max": null, 321 | "min": null, 322 | "show": true 323 | }, 324 | { 325 | "format": "short", 326 | "label": null, 327 | "logBase": 1, 328 | "max": null, 329 | "min": null, 330 | "show": true 331 | } 332 | ], 333 | "yaxis": { 334 | "align": false, 335 | "alignLevel": null 336 | } 337 | }, 338 | { 339 | "aliasColors": { 340 | "Watchers": "semi-dark-purple" 341 | }, 342 | "bars": false, 343 | "dashLength": 10, 344 | "dashes": false, 345 | "datasource": "${DS_INFLUXDB_GITHUB}", 346 | "decimals": 0, 347 | "description": "", 348 | "fieldConfig": { 349 | "defaults": { 350 | "custom": {} 351 | }, 352 | "overrides": [] 353 | }, 354 | "fill": 2, 355 | "fillGradient": 6, 356 | "gridPos": { 357 | "h": 12, 358 | "w": 7, 359 | "x": 17, 360 | "y": 1 361 | }, 362 | "hiddenSeries": false, 363 | "id": 9, 364 | "legend": { 365 | "alignAsTable": true, 366 | "avg": false, 367 | "current": true, 368 | "max": false, 369 | "min": false, 370 | "rightSide": true, 371 | "show": true, 372 | "total": false, 373 | "values": true 374 | }, 375 | "lines": true, 376 | "linewidth": 1, 377 | "nullPointMode": "null", 378 | "percentage": false, 379 | "pluginVersion": "7.1.1", 380 | "pointradius": 2, 381 | "points": false, 382 | "renderer": "flot", 383 | "seriesOverrides": [], 384 | "spaceLength": 10, 385 | "stack": false, 386 | "steppedLine": false, 387 | "targets": [ 388 | { 389 | "alias": "Watchers", 390 | "groupBy": [ 391 | { 392 | "params": [ 393 | "$__interval" 394 | ], 395 | "type": "time" 396 | }, 397 | { 398 | "params": [ 399 | "null" 400 | ], 401 | "type": "fill" 402 | } 403 | ], 404 | "measurement": "github", 405 | "orderByTime": "ASC", 406 | "policy": "stars", 407 | "query": "SELECT \"value\" FROM \"watchers\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 408 | "rawQuery": true, 409 | "refId": "A", 410 | "resultFormat": "time_series", 411 | "select": [ 412 | [ 413 | { 414 | "params": [ 415 | "value" 416 | ], 417 | "type": "field" 418 | }, 419 | { 420 | "params": [], 421 | "type": "mean" 422 | } 423 | ] 424 | ], 425 | "tags": [] 426 | } 427 | ], 428 | "thresholds": [], 429 | "timeFrom": null, 430 | "timeRegions": [], 431 | "timeShift": null, 432 | "title": "Watchers", 433 | "tooltip": { 434 | "shared": true, 435 | "sort": 2, 436 | "value_type": "individual" 437 | }, 438 | "type": "graph", 439 | "xaxis": { 440 | "buckets": null, 441 | "mode": "time", 442 | "name": null, 443 | "show": true, 444 | "values": [] 445 | }, 446 | "yaxes": [ 447 | { 448 | "decimals": 0, 449 | "format": "none", 450 | "label": null, 451 | "logBase": 1, 452 | "max": null, 453 | "min": null, 454 | "show": true 455 | }, 456 | { 457 | "format": "short", 458 | "label": null, 459 | "logBase": 1, 460 | "max": null, 461 | "min": null, 462 | "show": true 463 | } 464 | ], 465 | "yaxis": { 466 | "align": false, 467 | "alignLevel": null 468 | } 469 | }, 470 | { 471 | "aliasColors": { 472 | "Issues": "dark-red", 473 | "Open": "semi-dark-green" 474 | }, 475 | "bars": false, 476 | "dashLength": 10, 477 | "dashes": false, 478 | "datasource": "${DS_INFLUXDB_GITHUB}", 479 | "decimals": 0, 480 | "description": "", 481 | "fieldConfig": { 482 | "defaults": { 483 | "custom": {} 484 | }, 485 | "overrides": [] 486 | }, 487 | "fill": 2, 488 | "fillGradient": 6, 489 | "gridPos": { 490 | "h": 10, 491 | "w": 9, 492 | "x": 0, 493 | "y": 13 494 | }, 495 | "hiddenSeries": false, 496 | "id": 11, 497 | "legend": { 498 | "alignAsTable": true, 499 | "avg": false, 500 | "current": true, 501 | "max": false, 502 | "min": false, 503 | "rightSide": true, 504 | "show": true, 505 | "total": false, 506 | "values": true 507 | }, 508 | "lines": true, 509 | "linewidth": 1, 510 | "nullPointMode": "null", 511 | "percentage": false, 512 | "pluginVersion": "7.1.1", 513 | "pointradius": 2, 514 | "points": false, 515 | "renderer": "flot", 516 | "seriesOverrides": [], 517 | "spaceLength": 10, 518 | "stack": false, 519 | "steppedLine": false, 520 | "targets": [ 521 | { 522 | "alias": "Issues", 523 | "groupBy": [ 524 | { 525 | "params": [ 526 | "$__interval" 527 | ], 528 | "type": "time" 529 | }, 530 | { 531 | "params": [ 532 | "null" 533 | ], 534 | "type": "fill" 535 | } 536 | ], 537 | "orderByTime": "ASC", 538 | "policy": "default", 539 | "query": "SELECT \"total\" FROM \"issues\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 540 | "rawQuery": true, 541 | "refId": "A", 542 | "resultFormat": "time_series", 543 | "select": [ 544 | [ 545 | { 546 | "params": [ 547 | "value" 548 | ], 549 | "type": "field" 550 | }, 551 | { 552 | "params": [], 553 | "type": "mean" 554 | } 555 | ] 556 | ], 557 | "tags": [] 558 | }, 559 | { 560 | "alias": "Open", 561 | "groupBy": [ 562 | { 563 | "params": [ 564 | "$__interval" 565 | ], 566 | "type": "time" 567 | }, 568 | { 569 | "params": [ 570 | "null" 571 | ], 572 | "type": "fill" 573 | } 574 | ], 575 | "orderByTime": "ASC", 576 | "policy": "default", 577 | "query": "SELECT \"open\" FROM \"issues\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 578 | "rawQuery": true, 579 | "refId": "B", 580 | "resultFormat": "time_series", 581 | "select": [ 582 | [ 583 | { 584 | "params": [ 585 | "value" 586 | ], 587 | "type": "field" 588 | }, 589 | { 590 | "params": [], 591 | "type": "mean" 592 | } 593 | ] 594 | ], 595 | "tags": [] 596 | } 597 | ], 598 | "thresholds": [], 599 | "timeFrom": null, 600 | "timeRegions": [], 601 | "timeShift": null, 602 | "title": "Issues", 603 | "tooltip": { 604 | "shared": true, 605 | "sort": 2, 606 | "value_type": "individual" 607 | }, 608 | "type": "graph", 609 | "xaxis": { 610 | "buckets": null, 611 | "mode": "time", 612 | "name": null, 613 | "show": true, 614 | "values": [] 615 | }, 616 | "yaxes": [ 617 | { 618 | "decimals": 0, 619 | "format": "short", 620 | "label": null, 621 | "logBase": 1, 622 | "max": null, 623 | "min": "0", 624 | "show": true 625 | }, 626 | { 627 | "format": "short", 628 | "label": null, 629 | "logBase": 1, 630 | "max": null, 631 | "min": null, 632 | "show": true 633 | } 634 | ], 635 | "yaxis": { 636 | "align": false, 637 | "alignLevel": null 638 | } 639 | }, 640 | { 641 | "aliasColors": { 642 | "Merged": "semi-dark-green", 643 | "Open": "light-yellow", 644 | "PRs": "dark-red" 645 | }, 646 | "bars": false, 647 | "dashLength": 10, 648 | "dashes": false, 649 | "datasource": "${DS_INFLUXDB_GITHUB}", 650 | "decimals": 0, 651 | "description": "", 652 | "fieldConfig": { 653 | "defaults": { 654 | "custom": {} 655 | }, 656 | "overrides": [] 657 | }, 658 | "fill": 2, 659 | "fillGradient": 6, 660 | "gridPos": { 661 | "h": 10, 662 | "w": 8, 663 | "x": 9, 664 | "y": 13 665 | }, 666 | "hiddenSeries": false, 667 | "id": 19, 668 | "legend": { 669 | "alignAsTable": true, 670 | "avg": false, 671 | "current": true, 672 | "max": false, 673 | "min": false, 674 | "rightSide": true, 675 | "show": true, 676 | "total": false, 677 | "values": true 678 | }, 679 | "lines": true, 680 | "linewidth": 1, 681 | "nullPointMode": "null", 682 | "percentage": false, 683 | "pluginVersion": "7.1.1", 684 | "pointradius": 2, 685 | "points": false, 686 | "renderer": "flot", 687 | "seriesOverrides": [], 688 | "spaceLength": 10, 689 | "stack": false, 690 | "steppedLine": false, 691 | "targets": [ 692 | { 693 | "alias": "PRs", 694 | "groupBy": [ 695 | { 696 | "params": [ 697 | "$__interval" 698 | ], 699 | "type": "time" 700 | }, 701 | { 702 | "params": [ 703 | "null" 704 | ], 705 | "type": "fill" 706 | } 707 | ], 708 | "orderByTime": "ASC", 709 | "policy": "default", 710 | "query": "SELECT \"total\" FROM \"pullrequests\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 711 | "rawQuery": true, 712 | "refId": "A", 713 | "resultFormat": "time_series", 714 | "select": [ 715 | [ 716 | { 717 | "params": [ 718 | "value" 719 | ], 720 | "type": "field" 721 | }, 722 | { 723 | "params": [], 724 | "type": "mean" 725 | } 726 | ] 727 | ], 728 | "tags": [] 729 | }, 730 | { 731 | "alias": "Open", 732 | "groupBy": [ 733 | { 734 | "params": [ 735 | "$__interval" 736 | ], 737 | "type": "time" 738 | }, 739 | { 740 | "params": [ 741 | "null" 742 | ], 743 | "type": "fill" 744 | } 745 | ], 746 | "orderByTime": "ASC", 747 | "policy": "default", 748 | "query": "SELECT \"open\" FROM \"pullrequests\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 749 | "rawQuery": true, 750 | "refId": "B", 751 | "resultFormat": "time_series", 752 | "select": [ 753 | [ 754 | { 755 | "params": [ 756 | "value" 757 | ], 758 | "type": "field" 759 | }, 760 | { 761 | "params": [], 762 | "type": "mean" 763 | } 764 | ] 765 | ], 766 | "tags": [] 767 | }, 768 | { 769 | "alias": "Merged", 770 | "groupBy": [ 771 | { 772 | "params": [ 773 | "$__interval" 774 | ], 775 | "type": "time" 776 | }, 777 | { 778 | "params": [ 779 | "null" 780 | ], 781 | "type": "fill" 782 | } 783 | ], 784 | "orderByTime": "ASC", 785 | "policy": "default", 786 | "query": "SELECT \"merged\" FROM \"pullrequests\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 787 | "rawQuery": true, 788 | "refId": "C", 789 | "resultFormat": "time_series", 790 | "select": [ 791 | [ 792 | { 793 | "params": [ 794 | "value" 795 | ], 796 | "type": "field" 797 | }, 798 | { 799 | "params": [], 800 | "type": "mean" 801 | } 802 | ] 803 | ], 804 | "tags": [] 805 | } 806 | ], 807 | "thresholds": [], 808 | "timeFrom": null, 809 | "timeRegions": [], 810 | "timeShift": null, 811 | "title": "Pull Requests", 812 | "tooltip": { 813 | "shared": true, 814 | "sort": 2, 815 | "value_type": "individual" 816 | }, 817 | "type": "graph", 818 | "xaxis": { 819 | "buckets": null, 820 | "mode": "time", 821 | "name": null, 822 | "show": true, 823 | "values": [] 824 | }, 825 | "yaxes": [ 826 | { 827 | "decimals": 0, 828 | "format": "short", 829 | "label": null, 830 | "logBase": 1, 831 | "max": null, 832 | "min": "0", 833 | "show": true 834 | }, 835 | { 836 | "format": "short", 837 | "label": null, 838 | "logBase": 1, 839 | "max": null, 840 | "min": null, 841 | "show": true 842 | } 843 | ], 844 | "yaxis": { 845 | "align": false, 846 | "alignLevel": null 847 | } 848 | }, 849 | { 850 | "aliasColors": { 851 | "Commits": "semi-dark-green" 852 | }, 853 | "bars": false, 854 | "dashLength": 10, 855 | "dashes": false, 856 | "datasource": "${DS_INFLUXDB_GITHUB}", 857 | "decimals": 0, 858 | "description": "", 859 | "fieldConfig": { 860 | "defaults": { 861 | "custom": {} 862 | }, 863 | "overrides": [] 864 | }, 865 | "fill": 2, 866 | "fillGradient": 6, 867 | "gridPos": { 868 | "h": 10, 869 | "w": 7, 870 | "x": 17, 871 | "y": 13 872 | }, 873 | "hiddenSeries": false, 874 | "id": 5, 875 | "legend": { 876 | "alignAsTable": true, 877 | "avg": false, 878 | "current": true, 879 | "max": false, 880 | "min": false, 881 | "rightSide": true, 882 | "show": true, 883 | "total": false, 884 | "values": true 885 | }, 886 | "lines": true, 887 | "linewidth": 1, 888 | "nullPointMode": "null", 889 | "percentage": false, 890 | "pluginVersion": "7.1.1", 891 | "pointradius": 2, 892 | "points": false, 893 | "renderer": "flot", 894 | "seriesOverrides": [], 895 | "spaceLength": 10, 896 | "stack": false, 897 | "steppedLine": false, 898 | "targets": [ 899 | { 900 | "alias": "Commits", 901 | "groupBy": [ 902 | { 903 | "params": [ 904 | "$__interval" 905 | ], 906 | "type": "time" 907 | }, 908 | { 909 | "params": [ 910 | "null" 911 | ], 912 | "type": "fill" 913 | } 914 | ], 915 | "orderByTime": "ASC", 916 | "policy": "default", 917 | "query": "SELECT \"value\" FROM \"commits\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"repo\" fill(null)", 918 | "rawQuery": true, 919 | "refId": "A", 920 | "resultFormat": "time_series", 921 | "select": [ 922 | [ 923 | { 924 | "params": [ 925 | "value" 926 | ], 927 | "type": "field" 928 | }, 929 | { 930 | "params": [], 931 | "type": "mean" 932 | } 933 | ] 934 | ], 935 | "tags": [] 936 | } 937 | ], 938 | "thresholds": [], 939 | "timeFrom": null, 940 | "timeRegions": [], 941 | "timeShift": null, 942 | "title": "Commits", 943 | "tooltip": { 944 | "shared": true, 945 | "sort": 2, 946 | "value_type": "individual" 947 | }, 948 | "type": "graph", 949 | "xaxis": { 950 | "buckets": null, 951 | "mode": "time", 952 | "name": null, 953 | "show": true, 954 | "values": [] 955 | }, 956 | "yaxes": [ 957 | { 958 | "decimals": 0, 959 | "format": "short", 960 | "label": null, 961 | "logBase": 2, 962 | "max": null, 963 | "min": null, 964 | "show": true 965 | }, 966 | { 967 | "format": "short", 968 | "label": null, 969 | "logBase": 1, 970 | "max": null, 971 | "min": null, 972 | "show": true 973 | } 974 | ], 975 | "yaxis": { 976 | "align": false, 977 | "alignLevel": null 978 | } 979 | }, 980 | { 981 | "collapsed": false, 982 | "datasource": "${DS_INFLUXDB}", 983 | "gridPos": { 984 | "h": 1, 985 | "w": 24, 986 | "x": 0, 987 | "y": 23 988 | }, 989 | "id": 36, 990 | "panels": [], 991 | "title": "Open Issues", 992 | "type": "row" 993 | }, 994 | { 995 | "aliasColors": {}, 996 | "bars": false, 997 | "dashLength": 10, 998 | "dashes": false, 999 | "datasource": "${DS_INFLUXDB_GITHUB}", 1000 | "decimals": 0, 1001 | "description": "", 1002 | "fieldConfig": { 1003 | "defaults": { 1004 | "custom": {} 1005 | }, 1006 | "overrides": [] 1007 | }, 1008 | "fill": 0, 1009 | "fillGradient": 0, 1010 | "gridPos": { 1011 | "h": 11, 1012 | "w": 13, 1013 | "x": 0, 1014 | "y": 24 1015 | }, 1016 | "hiddenSeries": false, 1017 | "id": 16, 1018 | "legend": { 1019 | "alignAsTable": true, 1020 | "avg": false, 1021 | "current": true, 1022 | "hideEmpty": false, 1023 | "hideZero": false, 1024 | "max": false, 1025 | "min": false, 1026 | "rightSide": true, 1027 | "show": true, 1028 | "total": false, 1029 | "values": true 1030 | }, 1031 | "lines": true, 1032 | "linewidth": 1, 1033 | "nullPointMode": "null", 1034 | "percentage": false, 1035 | "pluginVersion": "7.1.1", 1036 | "pointradius": 2, 1037 | "points": false, 1038 | "renderer": "flot", 1039 | "seriesOverrides": [], 1040 | "spaceLength": 10, 1041 | "stack": false, 1042 | "steppedLine": false, 1043 | "targets": [ 1044 | { 1045 | "alias": "$tag_name", 1046 | "groupBy": [ 1047 | { 1048 | "params": [ 1049 | "$__interval" 1050 | ], 1051 | "type": "time" 1052 | }, 1053 | { 1054 | "params": [ 1055 | "null" 1056 | ], 1057 | "type": "fill" 1058 | } 1059 | ], 1060 | "orderByTime": "ASC", 1061 | "policy": "default", 1062 | "query": "SELECT \"open\" FROM \"issues_labels\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 1063 | "rawQuery": true, 1064 | "refId": "A", 1065 | "resultFormat": "time_series", 1066 | "select": [ 1067 | [ 1068 | { 1069 | "params": [ 1070 | "value" 1071 | ], 1072 | "type": "field" 1073 | }, 1074 | { 1075 | "params": [], 1076 | "type": "mean" 1077 | } 1078 | ] 1079 | ], 1080 | "tags": [] 1081 | } 1082 | ], 1083 | "thresholds": [], 1084 | "timeFrom": null, 1085 | "timeRegions": [], 1086 | "timeShift": null, 1087 | "title": "Open Issue Labels", 1088 | "tooltip": { 1089 | "shared": true, 1090 | "sort": 2, 1091 | "value_type": "individual" 1092 | }, 1093 | "type": "graph", 1094 | "xaxis": { 1095 | "buckets": null, 1096 | "mode": "time", 1097 | "name": null, 1098 | "show": true, 1099 | "values": [] 1100 | }, 1101 | "yaxes": [ 1102 | { 1103 | "decimals": 0, 1104 | "format": "none", 1105 | "label": null, 1106 | "logBase": 1, 1107 | "max": null, 1108 | "min": "0", 1109 | "show": true 1110 | }, 1111 | { 1112 | "format": "short", 1113 | "label": null, 1114 | "logBase": 1, 1115 | "max": null, 1116 | "min": null, 1117 | "show": true 1118 | } 1119 | ], 1120 | "yaxis": { 1121 | "align": false, 1122 | "alignLevel": null 1123 | } 1124 | }, 1125 | { 1126 | "aliasColors": {}, 1127 | "bars": true, 1128 | "dashLength": 10, 1129 | "dashes": false, 1130 | "datasource": "${DS_INFLUXDB_GITHUB}", 1131 | "decimals": 0, 1132 | "description": "", 1133 | "fieldConfig": { 1134 | "defaults": { 1135 | "custom": {} 1136 | }, 1137 | "overrides": [] 1138 | }, 1139 | "fill": 0, 1140 | "fillGradient": 0, 1141 | "gridPos": { 1142 | "h": 11, 1143 | "w": 11, 1144 | "x": 13, 1145 | "y": 24 1146 | }, 1147 | "hiddenSeries": false, 1148 | "id": 18, 1149 | "legend": { 1150 | "alignAsTable": true, 1151 | "avg": false, 1152 | "current": true, 1153 | "hideEmpty": false, 1154 | "hideZero": false, 1155 | "max": false, 1156 | "min": false, 1157 | "rightSide": true, 1158 | "show": false, 1159 | "total": false, 1160 | "values": true 1161 | }, 1162 | "lines": false, 1163 | "linewidth": 1, 1164 | "nullPointMode": "null", 1165 | "percentage": false, 1166 | "pluginVersion": "7.1.1", 1167 | "pointradius": 2, 1168 | "points": false, 1169 | "renderer": "flot", 1170 | "seriesOverrides": [], 1171 | "spaceLength": 10, 1172 | "stack": false, 1173 | "steppedLine": false, 1174 | "targets": [ 1175 | { 1176 | "alias": "$tag_name", 1177 | "groupBy": [ 1178 | { 1179 | "params": [ 1180 | "$__interval" 1181 | ], 1182 | "type": "time" 1183 | }, 1184 | { 1185 | "params": [ 1186 | "null" 1187 | ], 1188 | "type": "fill" 1189 | } 1190 | ], 1191 | "orderByTime": "ASC", 1192 | "policy": "default", 1193 | "query": "SELECT \"open\" FROM \"issues_labels\" WHERE repo = '$repository' AND open > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 1194 | "rawQuery": true, 1195 | "refId": "A", 1196 | "resultFormat": "time_series", 1197 | "select": [ 1198 | [ 1199 | { 1200 | "params": [ 1201 | "value" 1202 | ], 1203 | "type": "field" 1204 | }, 1205 | { 1206 | "params": [], 1207 | "type": "mean" 1208 | } 1209 | ] 1210 | ], 1211 | "tags": [] 1212 | } 1213 | ], 1214 | "thresholds": [], 1215 | "timeFrom": null, 1216 | "timeRegions": [], 1217 | "timeShift": null, 1218 | "title": "Open Issue Labels", 1219 | "tooltip": { 1220 | "shared": false, 1221 | "sort": 2, 1222 | "value_type": "individual" 1223 | }, 1224 | "type": "graph", 1225 | "xaxis": { 1226 | "buckets": null, 1227 | "mode": "series", 1228 | "name": null, 1229 | "show": true, 1230 | "values": [ 1231 | "current" 1232 | ] 1233 | }, 1234 | "yaxes": [ 1235 | { 1236 | "decimals": 0, 1237 | "format": "none", 1238 | "label": null, 1239 | "logBase": 1, 1240 | "max": null, 1241 | "min": "0", 1242 | "show": true 1243 | }, 1244 | { 1245 | "format": "short", 1246 | "label": null, 1247 | "logBase": 1, 1248 | "max": null, 1249 | "min": null, 1250 | "show": true 1251 | } 1252 | ], 1253 | "yaxis": { 1254 | "align": false, 1255 | "alignLevel": null 1256 | } 1257 | }, 1258 | { 1259 | "aliasColors": {}, 1260 | "bars": false, 1261 | "dashLength": 10, 1262 | "dashes": false, 1263 | "datasource": "${DS_INFLUXDB_GITHUB}", 1264 | "decimals": 0, 1265 | "description": "", 1266 | "fieldConfig": { 1267 | "defaults": { 1268 | "custom": {} 1269 | }, 1270 | "overrides": [] 1271 | }, 1272 | "fill": 0, 1273 | "fillGradient": 0, 1274 | "gridPos": { 1275 | "h": 10, 1276 | "w": 13, 1277 | "x": 0, 1278 | "y": 35 1279 | }, 1280 | "hiddenSeries": false, 1281 | "id": 27, 1282 | "legend": { 1283 | "alignAsTable": true, 1284 | "avg": false, 1285 | "current": true, 1286 | "hideEmpty": false, 1287 | "hideZero": false, 1288 | "max": false, 1289 | "min": false, 1290 | "rightSide": true, 1291 | "show": true, 1292 | "total": false, 1293 | "values": true 1294 | }, 1295 | "lines": true, 1296 | "linewidth": 1, 1297 | "nullPointMode": "null", 1298 | "percentage": false, 1299 | "pluginVersion": "7.1.1", 1300 | "pointradius": 2, 1301 | "points": false, 1302 | "renderer": "flot", 1303 | "seriesOverrides": [], 1304 | "spaceLength": 10, 1305 | "stack": false, 1306 | "steppedLine": false, 1307 | "targets": [ 1308 | { 1309 | "alias": "$tag_name", 1310 | "groupBy": [ 1311 | { 1312 | "params": [ 1313 | "$__interval" 1314 | ], 1315 | "type": "time" 1316 | }, 1317 | { 1318 | "params": [ 1319 | "null" 1320 | ], 1321 | "type": "fill" 1322 | } 1323 | ], 1324 | "orderByTime": "ASC", 1325 | "policy": "default", 1326 | "query": "SELECT \"open\" FROM \"issues_assignees\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 1327 | "rawQuery": true, 1328 | "refId": "A", 1329 | "resultFormat": "time_series", 1330 | "select": [ 1331 | [ 1332 | { 1333 | "params": [ 1334 | "value" 1335 | ], 1336 | "type": "field" 1337 | }, 1338 | { 1339 | "params": [], 1340 | "type": "mean" 1341 | } 1342 | ] 1343 | ], 1344 | "tags": [] 1345 | } 1346 | ], 1347 | "thresholds": [], 1348 | "timeFrom": null, 1349 | "timeRegions": [], 1350 | "timeShift": null, 1351 | "title": "Open Issue Assignees", 1352 | "tooltip": { 1353 | "shared": true, 1354 | "sort": 2, 1355 | "value_type": "individual" 1356 | }, 1357 | "type": "graph", 1358 | "xaxis": { 1359 | "buckets": null, 1360 | "mode": "time", 1361 | "name": null, 1362 | "show": true, 1363 | "values": [] 1364 | }, 1365 | "yaxes": [ 1366 | { 1367 | "decimals": 0, 1368 | "format": "none", 1369 | "label": null, 1370 | "logBase": 1, 1371 | "max": null, 1372 | "min": "0", 1373 | "show": true 1374 | }, 1375 | { 1376 | "format": "short", 1377 | "label": null, 1378 | "logBase": 1, 1379 | "max": null, 1380 | "min": null, 1381 | "show": true 1382 | } 1383 | ], 1384 | "yaxis": { 1385 | "align": false, 1386 | "alignLevel": null 1387 | } 1388 | }, 1389 | { 1390 | "aliasColors": {}, 1391 | "bars": true, 1392 | "dashLength": 10, 1393 | "dashes": false, 1394 | "datasource": "${DS_INFLUXDB_GITHUB}", 1395 | "decimals": 0, 1396 | "description": "", 1397 | "fieldConfig": { 1398 | "defaults": { 1399 | "custom": {} 1400 | }, 1401 | "overrides": [] 1402 | }, 1403 | "fill": 0, 1404 | "fillGradient": 0, 1405 | "gridPos": { 1406 | "h": 10, 1407 | "w": 11, 1408 | "x": 13, 1409 | "y": 35 1410 | }, 1411 | "hiddenSeries": false, 1412 | "id": 22, 1413 | "legend": { 1414 | "alignAsTable": true, 1415 | "avg": false, 1416 | "current": true, 1417 | "hideEmpty": false, 1418 | "hideZero": false, 1419 | "max": false, 1420 | "min": false, 1421 | "rightSide": true, 1422 | "show": false, 1423 | "total": false, 1424 | "values": true 1425 | }, 1426 | "lines": false, 1427 | "linewidth": 1, 1428 | "nullPointMode": "null", 1429 | "percentage": false, 1430 | "pluginVersion": "7.1.1", 1431 | "pointradius": 2, 1432 | "points": false, 1433 | "renderer": "flot", 1434 | "seriesOverrides": [], 1435 | "spaceLength": 10, 1436 | "stack": false, 1437 | "steppedLine": false, 1438 | "targets": [ 1439 | { 1440 | "alias": "$tag_name", 1441 | "groupBy": [ 1442 | { 1443 | "params": [ 1444 | "$__interval" 1445 | ], 1446 | "type": "time" 1447 | }, 1448 | { 1449 | "params": [ 1450 | "null" 1451 | ], 1452 | "type": "fill" 1453 | } 1454 | ], 1455 | "orderByTime": "ASC", 1456 | "policy": "default", 1457 | "query": "SELECT \"open\" FROM \"issues_assignees\" WHERE repo = '$repository' AND open > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 1458 | "rawQuery": true, 1459 | "refId": "A", 1460 | "resultFormat": "time_series", 1461 | "select": [ 1462 | [ 1463 | { 1464 | "params": [ 1465 | "value" 1466 | ], 1467 | "type": "field" 1468 | }, 1469 | { 1470 | "params": [], 1471 | "type": "mean" 1472 | } 1473 | ] 1474 | ], 1475 | "tags": [] 1476 | } 1477 | ], 1478 | "thresholds": [], 1479 | "timeFrom": null, 1480 | "timeRegions": [], 1481 | "timeShift": null, 1482 | "title": "Open Issue Assignees", 1483 | "tooltip": { 1484 | "shared": false, 1485 | "sort": 2, 1486 | "value_type": "individual" 1487 | }, 1488 | "type": "graph", 1489 | "xaxis": { 1490 | "buckets": null, 1491 | "mode": "series", 1492 | "name": null, 1493 | "show": true, 1494 | "values": [ 1495 | "current" 1496 | ] 1497 | }, 1498 | "yaxes": [ 1499 | { 1500 | "decimals": 0, 1501 | "format": "none", 1502 | "label": null, 1503 | "logBase": 1, 1504 | "max": null, 1505 | "min": "0", 1506 | "show": true 1507 | }, 1508 | { 1509 | "format": "short", 1510 | "label": null, 1511 | "logBase": 1, 1512 | "max": null, 1513 | "min": null, 1514 | "show": true 1515 | } 1516 | ], 1517 | "yaxis": { 1518 | "align": false, 1519 | "alignLevel": null 1520 | } 1521 | }, 1522 | { 1523 | "collapsed": false, 1524 | "datasource": "${DS_INFLUXDB}", 1525 | "gridPos": { 1526 | "h": 1, 1527 | "w": 24, 1528 | "x": 0, 1529 | "y": 45 1530 | }, 1531 | "id": 38, 1532 | "panels": [], 1533 | "title": "Open Pull Requests", 1534 | "type": "row" 1535 | }, 1536 | { 1537 | "aliasColors": {}, 1538 | "bars": false, 1539 | "dashLength": 10, 1540 | "dashes": false, 1541 | "datasource": "${DS_INFLUXDB_GITHUB}", 1542 | "decimals": 0, 1543 | "description": "", 1544 | "fieldConfig": { 1545 | "defaults": { 1546 | "custom": {} 1547 | }, 1548 | "overrides": [] 1549 | }, 1550 | "fill": 0, 1551 | "fillGradient": 0, 1552 | "gridPos": { 1553 | "h": 11, 1554 | "w": 13, 1555 | "x": 0, 1556 | "y": 46 1557 | }, 1558 | "hiddenSeries": false, 1559 | "id": 21, 1560 | "legend": { 1561 | "alignAsTable": true, 1562 | "avg": false, 1563 | "current": true, 1564 | "hideEmpty": false, 1565 | "hideZero": false, 1566 | "max": false, 1567 | "min": false, 1568 | "rightSide": true, 1569 | "show": true, 1570 | "total": false, 1571 | "values": true 1572 | }, 1573 | "lines": true, 1574 | "linewidth": 1, 1575 | "nullPointMode": "null", 1576 | "percentage": false, 1577 | "pluginVersion": "7.1.1", 1578 | "pointradius": 2, 1579 | "points": false, 1580 | "renderer": "flot", 1581 | "seriesOverrides": [], 1582 | "spaceLength": 10, 1583 | "stack": false, 1584 | "steppedLine": false, 1585 | "targets": [ 1586 | { 1587 | "alias": "$tag_name", 1588 | "groupBy": [ 1589 | { 1590 | "params": [ 1591 | "$__interval" 1592 | ], 1593 | "type": "time" 1594 | }, 1595 | { 1596 | "params": [ 1597 | "null" 1598 | ], 1599 | "type": "fill" 1600 | } 1601 | ], 1602 | "orderByTime": "ASC", 1603 | "policy": "default", 1604 | "query": "SELECT \"open\" FROM \"pullrequests_assignees\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 1605 | "rawQuery": true, 1606 | "refId": "A", 1607 | "resultFormat": "time_series", 1608 | "select": [ 1609 | [ 1610 | { 1611 | "params": [ 1612 | "value" 1613 | ], 1614 | "type": "field" 1615 | }, 1616 | { 1617 | "params": [], 1618 | "type": "mean" 1619 | } 1620 | ] 1621 | ], 1622 | "tags": [] 1623 | } 1624 | ], 1625 | "thresholds": [], 1626 | "timeFrom": null, 1627 | "timeRegions": [], 1628 | "timeShift": null, 1629 | "title": "Open PR Assignees", 1630 | "tooltip": { 1631 | "shared": true, 1632 | "sort": 2, 1633 | "value_type": "individual" 1634 | }, 1635 | "type": "graph", 1636 | "xaxis": { 1637 | "buckets": null, 1638 | "mode": "time", 1639 | "name": null, 1640 | "show": true, 1641 | "values": [] 1642 | }, 1643 | "yaxes": [ 1644 | { 1645 | "decimals": 0, 1646 | "format": "none", 1647 | "label": null, 1648 | "logBase": 1, 1649 | "max": null, 1650 | "min": "0", 1651 | "show": true 1652 | }, 1653 | { 1654 | "format": "short", 1655 | "label": null, 1656 | "logBase": 1, 1657 | "max": null, 1658 | "min": null, 1659 | "show": true 1660 | } 1661 | ], 1662 | "yaxis": { 1663 | "align": false, 1664 | "alignLevel": null 1665 | } 1666 | }, 1667 | { 1668 | "aliasColors": {}, 1669 | "bars": true, 1670 | "dashLength": 10, 1671 | "dashes": false, 1672 | "datasource": "${DS_INFLUXDB_GITHUB}", 1673 | "decimals": 0, 1674 | "description": "", 1675 | "fieldConfig": { 1676 | "defaults": { 1677 | "custom": {} 1678 | }, 1679 | "overrides": [] 1680 | }, 1681 | "fill": 0, 1682 | "fillGradient": 0, 1683 | "gridPos": { 1684 | "h": 11, 1685 | "w": 11, 1686 | "x": 13, 1687 | "y": 46 1688 | }, 1689 | "hiddenSeries": false, 1690 | "id": 23, 1691 | "legend": { 1692 | "alignAsTable": true, 1693 | "avg": false, 1694 | "current": true, 1695 | "hideEmpty": false, 1696 | "hideZero": false, 1697 | "max": false, 1698 | "min": false, 1699 | "rightSide": true, 1700 | "show": false, 1701 | "total": false, 1702 | "values": true 1703 | }, 1704 | "lines": false, 1705 | "linewidth": 1, 1706 | "nullPointMode": "null", 1707 | "percentage": false, 1708 | "pluginVersion": "7.1.1", 1709 | "pointradius": 2, 1710 | "points": false, 1711 | "renderer": "flot", 1712 | "seriesOverrides": [], 1713 | "spaceLength": 10, 1714 | "stack": false, 1715 | "steppedLine": false, 1716 | "targets": [ 1717 | { 1718 | "alias": "$tag_name", 1719 | "groupBy": [ 1720 | { 1721 | "params": [ 1722 | "$__interval" 1723 | ], 1724 | "type": "time" 1725 | }, 1726 | { 1727 | "params": [ 1728 | "null" 1729 | ], 1730 | "type": "fill" 1731 | } 1732 | ], 1733 | "orderByTime": "ASC", 1734 | "policy": "default", 1735 | "query": "SELECT \"open\" FROM \"pullrequests_assignees\" WHERE repo = '$repository' AND open > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 1736 | "rawQuery": true, 1737 | "refId": "A", 1738 | "resultFormat": "time_series", 1739 | "select": [ 1740 | [ 1741 | { 1742 | "params": [ 1743 | "value" 1744 | ], 1745 | "type": "field" 1746 | }, 1747 | { 1748 | "params": [], 1749 | "type": "mean" 1750 | } 1751 | ] 1752 | ], 1753 | "tags": [] 1754 | } 1755 | ], 1756 | "thresholds": [], 1757 | "timeFrom": null, 1758 | "timeRegions": [], 1759 | "timeShift": null, 1760 | "title": "Open PR Assignees", 1761 | "tooltip": { 1762 | "shared": false, 1763 | "sort": 2, 1764 | "value_type": "individual" 1765 | }, 1766 | "type": "graph", 1767 | "xaxis": { 1768 | "buckets": null, 1769 | "mode": "series", 1770 | "name": null, 1771 | "show": true, 1772 | "values": [ 1773 | "current" 1774 | ] 1775 | }, 1776 | "yaxes": [ 1777 | { 1778 | "decimals": 0, 1779 | "format": "none", 1780 | "label": null, 1781 | "logBase": 1, 1782 | "max": null, 1783 | "min": "0", 1784 | "show": true 1785 | }, 1786 | { 1787 | "format": "short", 1788 | "label": null, 1789 | "logBase": 1, 1790 | "max": null, 1791 | "min": null, 1792 | "show": true 1793 | } 1794 | ], 1795 | "yaxis": { 1796 | "align": false, 1797 | "alignLevel": null 1798 | } 1799 | }, 1800 | { 1801 | "collapsed": false, 1802 | "datasource": "${DS_INFLUXDB}", 1803 | "gridPos": { 1804 | "h": 1, 1805 | "w": 24, 1806 | "x": 0, 1807 | "y": 57 1808 | }, 1809 | "id": 30, 1810 | "panels": [], 1811 | "title": "Issues", 1812 | "type": "row" 1813 | }, 1814 | { 1815 | "aliasColors": {}, 1816 | "bars": false, 1817 | "dashLength": 10, 1818 | "dashes": false, 1819 | "datasource": "${DS_INFLUXDB_GITHUB}", 1820 | "decimals": 0, 1821 | "description": "", 1822 | "fieldConfig": { 1823 | "defaults": { 1824 | "custom": {} 1825 | }, 1826 | "overrides": [] 1827 | }, 1828 | "fill": 0, 1829 | "fillGradient": 0, 1830 | "gridPos": { 1831 | "h": 11, 1832 | "w": 13, 1833 | "x": 0, 1834 | "y": 58 1835 | }, 1836 | "hiddenSeries": false, 1837 | "id": 15, 1838 | "legend": { 1839 | "alignAsTable": true, 1840 | "avg": false, 1841 | "current": true, 1842 | "hideEmpty": false, 1843 | "hideZero": false, 1844 | "max": false, 1845 | "min": false, 1846 | "rightSide": true, 1847 | "show": true, 1848 | "total": false, 1849 | "values": true 1850 | }, 1851 | "lines": true, 1852 | "linewidth": 1, 1853 | "nullPointMode": "null", 1854 | "percentage": false, 1855 | "pluginVersion": "7.1.1", 1856 | "pointradius": 2, 1857 | "points": false, 1858 | "renderer": "flot", 1859 | "seriesOverrides": [], 1860 | "spaceLength": 10, 1861 | "stack": false, 1862 | "steppedLine": false, 1863 | "targets": [ 1864 | { 1865 | "alias": "$tag_name", 1866 | "groupBy": [ 1867 | { 1868 | "params": [ 1869 | "$__interval" 1870 | ], 1871 | "type": "time" 1872 | }, 1873 | { 1874 | "params": [ 1875 | "null" 1876 | ], 1877 | "type": "fill" 1878 | } 1879 | ], 1880 | "orderByTime": "ASC", 1881 | "policy": "default", 1882 | "query": "SELECT \"total\" FROM \"issues_labels\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 1883 | "rawQuery": true, 1884 | "refId": "A", 1885 | "resultFormat": "time_series", 1886 | "select": [ 1887 | [ 1888 | { 1889 | "params": [ 1890 | "value" 1891 | ], 1892 | "type": "field" 1893 | }, 1894 | { 1895 | "params": [], 1896 | "type": "mean" 1897 | } 1898 | ] 1899 | ], 1900 | "tags": [] 1901 | } 1902 | ], 1903 | "thresholds": [], 1904 | "timeFrom": null, 1905 | "timeRegions": [], 1906 | "timeShift": null, 1907 | "title": "Issue Labels", 1908 | "tooltip": { 1909 | "shared": true, 1910 | "sort": 2, 1911 | "value_type": "individual" 1912 | }, 1913 | "type": "graph", 1914 | "xaxis": { 1915 | "buckets": null, 1916 | "mode": "time", 1917 | "name": null, 1918 | "show": true, 1919 | "values": [] 1920 | }, 1921 | "yaxes": [ 1922 | { 1923 | "decimals": 0, 1924 | "format": "none", 1925 | "label": null, 1926 | "logBase": 1, 1927 | "max": null, 1928 | "min": "0", 1929 | "show": true 1930 | }, 1931 | { 1932 | "format": "short", 1933 | "label": null, 1934 | "logBase": 1, 1935 | "max": null, 1936 | "min": null, 1937 | "show": true 1938 | } 1939 | ], 1940 | "yaxis": { 1941 | "align": false, 1942 | "alignLevel": null 1943 | } 1944 | }, 1945 | { 1946 | "aliasColors": {}, 1947 | "bars": true, 1948 | "dashLength": 10, 1949 | "dashes": false, 1950 | "datasource": "${DS_INFLUXDB_GITHUB}", 1951 | "decimals": 0, 1952 | "description": "", 1953 | "fieldConfig": { 1954 | "defaults": { 1955 | "custom": {} 1956 | }, 1957 | "overrides": [] 1958 | }, 1959 | "fill": 0, 1960 | "fillGradient": 0, 1961 | "gridPos": { 1962 | "h": 11, 1963 | "w": 11, 1964 | "x": 13, 1965 | "y": 58 1966 | }, 1967 | "hiddenSeries": false, 1968 | "id": 13, 1969 | "legend": { 1970 | "alignAsTable": true, 1971 | "avg": false, 1972 | "current": true, 1973 | "hideEmpty": false, 1974 | "hideZero": false, 1975 | "max": false, 1976 | "min": false, 1977 | "rightSide": true, 1978 | "show": false, 1979 | "total": false, 1980 | "values": true 1981 | }, 1982 | "lines": false, 1983 | "linewidth": 1, 1984 | "nullPointMode": "null", 1985 | "percentage": false, 1986 | "pluginVersion": "7.1.1", 1987 | "pointradius": 2, 1988 | "points": false, 1989 | "renderer": "flot", 1990 | "seriesOverrides": [], 1991 | "spaceLength": 10, 1992 | "stack": false, 1993 | "steppedLine": false, 1994 | "targets": [ 1995 | { 1996 | "alias": "$tag_name", 1997 | "groupBy": [ 1998 | { 1999 | "params": [ 2000 | "$__interval" 2001 | ], 2002 | "type": "time" 2003 | }, 2004 | { 2005 | "params": [ 2006 | "null" 2007 | ], 2008 | "type": "fill" 2009 | } 2010 | ], 2011 | "orderByTime": "ASC", 2012 | "policy": "default", 2013 | "query": "SELECT \"total\" FROM \"issues_labels\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 2014 | "rawQuery": true, 2015 | "refId": "A", 2016 | "resultFormat": "time_series", 2017 | "select": [ 2018 | [ 2019 | { 2020 | "params": [ 2021 | "value" 2022 | ], 2023 | "type": "field" 2024 | }, 2025 | { 2026 | "params": [], 2027 | "type": "mean" 2028 | } 2029 | ] 2030 | ], 2031 | "tags": [] 2032 | } 2033 | ], 2034 | "thresholds": [], 2035 | "timeFrom": null, 2036 | "timeRegions": [], 2037 | "timeShift": null, 2038 | "title": "Issue Labels", 2039 | "tooltip": { 2040 | "shared": false, 2041 | "sort": 2, 2042 | "value_type": "individual" 2043 | }, 2044 | "type": "graph", 2045 | "xaxis": { 2046 | "buckets": null, 2047 | "mode": "series", 2048 | "name": null, 2049 | "show": true, 2050 | "values": [ 2051 | "current" 2052 | ] 2053 | }, 2054 | "yaxes": [ 2055 | { 2056 | "decimals": 0, 2057 | "format": "none", 2058 | "label": null, 2059 | "logBase": 1, 2060 | "max": null, 2061 | "min": "0", 2062 | "show": true 2063 | }, 2064 | { 2065 | "format": "short", 2066 | "label": null, 2067 | "logBase": 1, 2068 | "max": null, 2069 | "min": null, 2070 | "show": true 2071 | } 2072 | ], 2073 | "yaxis": { 2074 | "align": false, 2075 | "alignLevel": null 2076 | } 2077 | }, 2078 | { 2079 | "aliasColors": {}, 2080 | "bars": false, 2081 | "dashLength": 10, 2082 | "dashes": false, 2083 | "datasource": "${DS_INFLUXDB_GITHUB}", 2084 | "decimals": 0, 2085 | "description": "", 2086 | "fieldConfig": { 2087 | "defaults": { 2088 | "custom": {} 2089 | }, 2090 | "overrides": [] 2091 | }, 2092 | "fill": 0, 2093 | "fillGradient": 0, 2094 | "gridPos": { 2095 | "h": 10, 2096 | "w": 13, 2097 | "x": 0, 2098 | "y": 69 2099 | }, 2100 | "hiddenSeries": false, 2101 | "id": 24, 2102 | "legend": { 2103 | "alignAsTable": true, 2104 | "avg": false, 2105 | "current": true, 2106 | "hideEmpty": false, 2107 | "hideZero": false, 2108 | "max": false, 2109 | "min": false, 2110 | "rightSide": true, 2111 | "show": true, 2112 | "total": false, 2113 | "values": true 2114 | }, 2115 | "lines": true, 2116 | "linewidth": 1, 2117 | "nullPointMode": "null", 2118 | "percentage": false, 2119 | "pluginVersion": "7.1.1", 2120 | "pointradius": 2, 2121 | "points": false, 2122 | "renderer": "flot", 2123 | "seriesOverrides": [], 2124 | "spaceLength": 10, 2125 | "stack": false, 2126 | "steppedLine": false, 2127 | "targets": [ 2128 | { 2129 | "alias": "$tag_name", 2130 | "groupBy": [ 2131 | { 2132 | "params": [ 2133 | "$__interval" 2134 | ], 2135 | "type": "time" 2136 | }, 2137 | { 2138 | "params": [ 2139 | "null" 2140 | ], 2141 | "type": "fill" 2142 | } 2143 | ], 2144 | "orderByTime": "ASC", 2145 | "policy": "default", 2146 | "query": "SELECT \"total\" FROM \"issues_assignees\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 2147 | "rawQuery": true, 2148 | "refId": "A", 2149 | "resultFormat": "time_series", 2150 | "select": [ 2151 | [ 2152 | { 2153 | "params": [ 2154 | "value" 2155 | ], 2156 | "type": "field" 2157 | }, 2158 | { 2159 | "params": [], 2160 | "type": "mean" 2161 | } 2162 | ] 2163 | ], 2164 | "tags": [] 2165 | } 2166 | ], 2167 | "thresholds": [], 2168 | "timeFrom": null, 2169 | "timeRegions": [], 2170 | "timeShift": null, 2171 | "title": "Issue Assignees", 2172 | "tooltip": { 2173 | "shared": true, 2174 | "sort": 2, 2175 | "value_type": "individual" 2176 | }, 2177 | "type": "graph", 2178 | "xaxis": { 2179 | "buckets": null, 2180 | "mode": "time", 2181 | "name": null, 2182 | "show": true, 2183 | "values": [] 2184 | }, 2185 | "yaxes": [ 2186 | { 2187 | "decimals": 0, 2188 | "format": "none", 2189 | "label": null, 2190 | "logBase": 1, 2191 | "max": null, 2192 | "min": "0", 2193 | "show": true 2194 | }, 2195 | { 2196 | "format": "short", 2197 | "label": null, 2198 | "logBase": 1, 2199 | "max": null, 2200 | "min": null, 2201 | "show": true 2202 | } 2203 | ], 2204 | "yaxis": { 2205 | "align": false, 2206 | "alignLevel": null 2207 | } 2208 | }, 2209 | { 2210 | "aliasColors": {}, 2211 | "bars": true, 2212 | "dashLength": 10, 2213 | "dashes": false, 2214 | "datasource": "${DS_INFLUXDB_GITHUB}", 2215 | "decimals": 0, 2216 | "description": "", 2217 | "fieldConfig": { 2218 | "defaults": { 2219 | "custom": {} 2220 | }, 2221 | "overrides": [] 2222 | }, 2223 | "fill": 0, 2224 | "fillGradient": 0, 2225 | "gridPos": { 2226 | "h": 10, 2227 | "w": 11, 2228 | "x": 13, 2229 | "y": 69 2230 | }, 2231 | "hiddenSeries": false, 2232 | "id": 28, 2233 | "legend": { 2234 | "alignAsTable": true, 2235 | "avg": false, 2236 | "current": true, 2237 | "hideEmpty": false, 2238 | "hideZero": false, 2239 | "max": false, 2240 | "min": false, 2241 | "rightSide": true, 2242 | "show": false, 2243 | "total": false, 2244 | "values": true 2245 | }, 2246 | "lines": false, 2247 | "linewidth": 1, 2248 | "nullPointMode": "null", 2249 | "percentage": false, 2250 | "pluginVersion": "7.1.1", 2251 | "pointradius": 2, 2252 | "points": false, 2253 | "renderer": "flot", 2254 | "seriesOverrides": [], 2255 | "spaceLength": 10, 2256 | "stack": false, 2257 | "steppedLine": false, 2258 | "targets": [ 2259 | { 2260 | "alias": "$tag_name", 2261 | "groupBy": [ 2262 | { 2263 | "params": [ 2264 | "$__interval" 2265 | ], 2266 | "type": "time" 2267 | }, 2268 | { 2269 | "params": [ 2270 | "null" 2271 | ], 2272 | "type": "fill" 2273 | } 2274 | ], 2275 | "orderByTime": "ASC", 2276 | "policy": "default", 2277 | "query": "SELECT \"total\" FROM \"issues_assignees\" WHERE repo = '$repository' AND total > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 2278 | "rawQuery": true, 2279 | "refId": "A", 2280 | "resultFormat": "time_series", 2281 | "select": [ 2282 | [ 2283 | { 2284 | "params": [ 2285 | "value" 2286 | ], 2287 | "type": "field" 2288 | }, 2289 | { 2290 | "params": [], 2291 | "type": "mean" 2292 | } 2293 | ] 2294 | ], 2295 | "tags": [] 2296 | } 2297 | ], 2298 | "thresholds": [], 2299 | "timeFrom": null, 2300 | "timeRegions": [], 2301 | "timeShift": null, 2302 | "title": "Issue Assignees", 2303 | "tooltip": { 2304 | "shared": false, 2305 | "sort": 2, 2306 | "value_type": "individual" 2307 | }, 2308 | "type": "graph", 2309 | "xaxis": { 2310 | "buckets": null, 2311 | "mode": "series", 2312 | "name": null, 2313 | "show": true, 2314 | "values": [ 2315 | "current" 2316 | ] 2317 | }, 2318 | "yaxes": [ 2319 | { 2320 | "decimals": 0, 2321 | "format": "none", 2322 | "label": null, 2323 | "logBase": 1, 2324 | "max": null, 2325 | "min": "0", 2326 | "show": true 2327 | }, 2328 | { 2329 | "format": "short", 2330 | "label": null, 2331 | "logBase": 1, 2332 | "max": null, 2333 | "min": null, 2334 | "show": true 2335 | } 2336 | ], 2337 | "yaxis": { 2338 | "align": false, 2339 | "alignLevel": null 2340 | } 2341 | }, 2342 | { 2343 | "collapsed": false, 2344 | "datasource": "${DS_INFLUXDB}", 2345 | "gridPos": { 2346 | "h": 1, 2347 | "w": 24, 2348 | "x": 0, 2349 | "y": 79 2350 | }, 2351 | "id": 34, 2352 | "panels": [], 2353 | "title": "Merged Pull Requests", 2354 | "type": "row" 2355 | }, 2356 | { 2357 | "aliasColors": {}, 2358 | "bars": false, 2359 | "dashLength": 10, 2360 | "dashes": false, 2361 | "datasource": "${DS_INFLUXDB_GITHUB}", 2362 | "decimals": 0, 2363 | "description": "", 2364 | "fieldConfig": { 2365 | "defaults": { 2366 | "custom": {} 2367 | }, 2368 | "overrides": [] 2369 | }, 2370 | "fill": 0, 2371 | "fillGradient": 0, 2372 | "gridPos": { 2373 | "h": 11, 2374 | "w": 13, 2375 | "x": 0, 2376 | "y": 80 2377 | }, 2378 | "hiddenSeries": false, 2379 | "id": 17, 2380 | "legend": { 2381 | "alignAsTable": true, 2382 | "avg": false, 2383 | "current": true, 2384 | "hideEmpty": false, 2385 | "hideZero": false, 2386 | "max": false, 2387 | "min": false, 2388 | "rightSide": true, 2389 | "show": true, 2390 | "total": false, 2391 | "values": true 2392 | }, 2393 | "lines": true, 2394 | "linewidth": 1, 2395 | "nullPointMode": "null", 2396 | "percentage": false, 2397 | "pluginVersion": "7.1.1", 2398 | "pointradius": 2, 2399 | "points": false, 2400 | "renderer": "flot", 2401 | "seriesOverrides": [], 2402 | "spaceLength": 10, 2403 | "stack": false, 2404 | "steppedLine": false, 2405 | "targets": [ 2406 | { 2407 | "alias": "$tag_name", 2408 | "groupBy": [ 2409 | { 2410 | "params": [ 2411 | "$__interval" 2412 | ], 2413 | "type": "time" 2414 | }, 2415 | { 2416 | "params": [ 2417 | "null" 2418 | ], 2419 | "type": "fill" 2420 | } 2421 | ], 2422 | "orderByTime": "ASC", 2423 | "policy": "default", 2424 | "query": "SELECT \"merged\" FROM \"pullrequests_labels\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 2425 | "rawQuery": true, 2426 | "refId": "A", 2427 | "resultFormat": "time_series", 2428 | "select": [ 2429 | [ 2430 | { 2431 | "params": [ 2432 | "value" 2433 | ], 2434 | "type": "field" 2435 | }, 2436 | { 2437 | "params": [], 2438 | "type": "mean" 2439 | } 2440 | ] 2441 | ], 2442 | "tags": [] 2443 | } 2444 | ], 2445 | "thresholds": [], 2446 | "timeFrom": null, 2447 | "timeRegions": [], 2448 | "timeShift": null, 2449 | "title": "Merged PR Labels", 2450 | "tooltip": { 2451 | "shared": true, 2452 | "sort": 2, 2453 | "value_type": "individual" 2454 | }, 2455 | "type": "graph", 2456 | "xaxis": { 2457 | "buckets": null, 2458 | "mode": "time", 2459 | "name": null, 2460 | "show": true, 2461 | "values": [] 2462 | }, 2463 | "yaxes": [ 2464 | { 2465 | "decimals": 0, 2466 | "format": "none", 2467 | "label": null, 2468 | "logBase": 1, 2469 | "max": null, 2470 | "min": "0", 2471 | "show": true 2472 | }, 2473 | { 2474 | "format": "short", 2475 | "label": null, 2476 | "logBase": 1, 2477 | "max": null, 2478 | "min": null, 2479 | "show": true 2480 | } 2481 | ], 2482 | "yaxis": { 2483 | "align": false, 2484 | "alignLevel": null 2485 | } 2486 | }, 2487 | { 2488 | "aliasColors": {}, 2489 | "bars": true, 2490 | "dashLength": 10, 2491 | "dashes": false, 2492 | "datasource": "${DS_INFLUXDB_GITHUB}", 2493 | "decimals": 0, 2494 | "description": "", 2495 | "fieldConfig": { 2496 | "defaults": { 2497 | "custom": {} 2498 | }, 2499 | "overrides": [] 2500 | }, 2501 | "fill": 0, 2502 | "fillGradient": 0, 2503 | "gridPos": { 2504 | "h": 11, 2505 | "w": 11, 2506 | "x": 13, 2507 | "y": 80 2508 | }, 2509 | "hiddenSeries": false, 2510 | "id": 25, 2511 | "legend": { 2512 | "alignAsTable": true, 2513 | "avg": false, 2514 | "current": true, 2515 | "hideEmpty": false, 2516 | "hideZero": false, 2517 | "max": false, 2518 | "min": false, 2519 | "rightSide": true, 2520 | "show": false, 2521 | "total": false, 2522 | "values": true 2523 | }, 2524 | "lines": false, 2525 | "linewidth": 1, 2526 | "nullPointMode": "null", 2527 | "percentage": false, 2528 | "pluginVersion": "7.1.1", 2529 | "pointradius": 2, 2530 | "points": false, 2531 | "renderer": "flot", 2532 | "seriesOverrides": [], 2533 | "spaceLength": 10, 2534 | "stack": false, 2535 | "steppedLine": false, 2536 | "targets": [ 2537 | { 2538 | "alias": "$tag_name", 2539 | "groupBy": [ 2540 | { 2541 | "params": [ 2542 | "$__interval" 2543 | ], 2544 | "type": "time" 2545 | }, 2546 | { 2547 | "params": [ 2548 | "null" 2549 | ], 2550 | "type": "fill" 2551 | } 2552 | ], 2553 | "orderByTime": "ASC", 2554 | "policy": "default", 2555 | "query": "SELECT \"merged\" FROM \"pullrequests_labels\" WHERE repo = '$repository' AND merged > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 2556 | "rawQuery": true, 2557 | "refId": "A", 2558 | "resultFormat": "time_series", 2559 | "select": [ 2560 | [ 2561 | { 2562 | "params": [ 2563 | "value" 2564 | ], 2565 | "type": "field" 2566 | }, 2567 | { 2568 | "params": [], 2569 | "type": "mean" 2570 | } 2571 | ] 2572 | ], 2573 | "tags": [] 2574 | } 2575 | ], 2576 | "thresholds": [], 2577 | "timeFrom": null, 2578 | "timeRegions": [], 2579 | "timeShift": null, 2580 | "title": "Merged PR Labels", 2581 | "tooltip": { 2582 | "shared": false, 2583 | "sort": 2, 2584 | "value_type": "individual" 2585 | }, 2586 | "type": "graph", 2587 | "xaxis": { 2588 | "buckets": null, 2589 | "mode": "series", 2590 | "name": null, 2591 | "show": true, 2592 | "values": [ 2593 | "current" 2594 | ] 2595 | }, 2596 | "yaxes": [ 2597 | { 2598 | "decimals": 0, 2599 | "format": "none", 2600 | "label": null, 2601 | "logBase": 1, 2602 | "max": null, 2603 | "min": "0", 2604 | "show": true 2605 | }, 2606 | { 2607 | "format": "short", 2608 | "label": null, 2609 | "logBase": 1, 2610 | "max": null, 2611 | "min": null, 2612 | "show": true 2613 | } 2614 | ], 2615 | "yaxis": { 2616 | "align": false, 2617 | "alignLevel": null 2618 | } 2619 | }, 2620 | { 2621 | "aliasColors": {}, 2622 | "bars": false, 2623 | "dashLength": 10, 2624 | "dashes": false, 2625 | "datasource": "${DS_INFLUXDB_GITHUB}", 2626 | "decimals": 0, 2627 | "description": "", 2628 | "fieldConfig": { 2629 | "defaults": { 2630 | "custom": {} 2631 | }, 2632 | "overrides": [] 2633 | }, 2634 | "fill": 0, 2635 | "fillGradient": 0, 2636 | "gridPos": { 2637 | "h": 11, 2638 | "w": 13, 2639 | "x": 0, 2640 | "y": 91 2641 | }, 2642 | "hiddenSeries": false, 2643 | "id": 20, 2644 | "legend": { 2645 | "alignAsTable": true, 2646 | "avg": false, 2647 | "current": true, 2648 | "hideEmpty": false, 2649 | "hideZero": false, 2650 | "max": false, 2651 | "min": false, 2652 | "rightSide": true, 2653 | "show": true, 2654 | "total": false, 2655 | "values": true 2656 | }, 2657 | "lines": true, 2658 | "linewidth": 1, 2659 | "nullPointMode": "null", 2660 | "percentage": false, 2661 | "pluginVersion": "7.1.1", 2662 | "pointradius": 2, 2663 | "points": false, 2664 | "renderer": "flot", 2665 | "seriesOverrides": [], 2666 | "spaceLength": 10, 2667 | "stack": false, 2668 | "steppedLine": false, 2669 | "targets": [ 2670 | { 2671 | "alias": "$tag_name", 2672 | "groupBy": [ 2673 | { 2674 | "params": [ 2675 | "$__interval" 2676 | ], 2677 | "type": "time" 2678 | }, 2679 | { 2680 | "params": [ 2681 | "null" 2682 | ], 2683 | "type": "fill" 2684 | } 2685 | ], 2686 | "orderByTime": "ASC", 2687 | "policy": "default", 2688 | "query": "SELECT \"merged\" FROM \"pullrequests_assignees\" WHERE repo = '$repository' AND $timeFilter GROUP BY \"name\" fill(null)", 2689 | "rawQuery": true, 2690 | "refId": "A", 2691 | "resultFormat": "time_series", 2692 | "select": [ 2693 | [ 2694 | { 2695 | "params": [ 2696 | "value" 2697 | ], 2698 | "type": "field" 2699 | }, 2700 | { 2701 | "params": [], 2702 | "type": "mean" 2703 | } 2704 | ] 2705 | ], 2706 | "tags": [] 2707 | } 2708 | ], 2709 | "thresholds": [], 2710 | "timeFrom": null, 2711 | "timeRegions": [], 2712 | "timeShift": null, 2713 | "title": "Merged PR Assignees", 2714 | "tooltip": { 2715 | "shared": true, 2716 | "sort": 2, 2717 | "value_type": "individual" 2718 | }, 2719 | "type": "graph", 2720 | "xaxis": { 2721 | "buckets": null, 2722 | "mode": "time", 2723 | "name": null, 2724 | "show": true, 2725 | "values": [] 2726 | }, 2727 | "yaxes": [ 2728 | { 2729 | "decimals": 0, 2730 | "format": "none", 2731 | "label": null, 2732 | "logBase": 1, 2733 | "max": null, 2734 | "min": "0", 2735 | "show": true 2736 | }, 2737 | { 2738 | "format": "short", 2739 | "label": null, 2740 | "logBase": 1, 2741 | "max": null, 2742 | "min": null, 2743 | "show": true 2744 | } 2745 | ], 2746 | "yaxis": { 2747 | "align": false, 2748 | "alignLevel": null 2749 | } 2750 | }, 2751 | { 2752 | "aliasColors": {}, 2753 | "bars": true, 2754 | "dashLength": 10, 2755 | "dashes": false, 2756 | "datasource": "${DS_INFLUXDB_GITHUB}", 2757 | "decimals": 0, 2758 | "description": "", 2759 | "fieldConfig": { 2760 | "defaults": { 2761 | "custom": {} 2762 | }, 2763 | "overrides": [] 2764 | }, 2765 | "fill": 0, 2766 | "fillGradient": 0, 2767 | "gridPos": { 2768 | "h": 11, 2769 | "w": 11, 2770 | "x": 13, 2771 | "y": 91 2772 | }, 2773 | "hiddenSeries": false, 2774 | "id": 26, 2775 | "legend": { 2776 | "alignAsTable": true, 2777 | "avg": false, 2778 | "current": true, 2779 | "hideEmpty": false, 2780 | "hideZero": false, 2781 | "max": false, 2782 | "min": false, 2783 | "rightSide": true, 2784 | "show": false, 2785 | "total": false, 2786 | "values": true 2787 | }, 2788 | "lines": false, 2789 | "linewidth": 1, 2790 | "nullPointMode": "null", 2791 | "percentage": false, 2792 | "pluginVersion": "7.1.1", 2793 | "pointradius": 2, 2794 | "points": false, 2795 | "renderer": "flot", 2796 | "seriesOverrides": [], 2797 | "spaceLength": 10, 2798 | "stack": false, 2799 | "steppedLine": false, 2800 | "targets": [ 2801 | { 2802 | "alias": "$tag_name", 2803 | "groupBy": [ 2804 | { 2805 | "params": [ 2806 | "$__interval" 2807 | ], 2808 | "type": "time" 2809 | }, 2810 | { 2811 | "params": [ 2812 | "null" 2813 | ], 2814 | "type": "fill" 2815 | } 2816 | ], 2817 | "orderByTime": "ASC", 2818 | "policy": "default", 2819 | "query": "SELECT \"merged\" FROM \"pullrequests_assignees\" WHERE repo = '$repository' AND merged > 0 AND $timeFilter GROUP BY \"name\" fill(null)", 2820 | "rawQuery": true, 2821 | "refId": "A", 2822 | "resultFormat": "time_series", 2823 | "select": [ 2824 | [ 2825 | { 2826 | "params": [ 2827 | "value" 2828 | ], 2829 | "type": "field" 2830 | }, 2831 | { 2832 | "params": [], 2833 | "type": "mean" 2834 | } 2835 | ] 2836 | ], 2837 | "tags": [] 2838 | } 2839 | ], 2840 | "thresholds": [], 2841 | "timeFrom": null, 2842 | "timeRegions": [], 2843 | "timeShift": null, 2844 | "title": "Merged PR Assignees", 2845 | "tooltip": { 2846 | "shared": false, 2847 | "sort": 2, 2848 | "value_type": "individual" 2849 | }, 2850 | "type": "graph", 2851 | "xaxis": { 2852 | "buckets": null, 2853 | "mode": "series", 2854 | "name": null, 2855 | "show": true, 2856 | "values": [ 2857 | "current" 2858 | ] 2859 | }, 2860 | "yaxes": [ 2861 | { 2862 | "decimals": 0, 2863 | "format": "none", 2864 | "label": null, 2865 | "logBase": 1, 2866 | "max": null, 2867 | "min": "0", 2868 | "show": true 2869 | }, 2870 | { 2871 | "format": "short", 2872 | "label": null, 2873 | "logBase": 1, 2874 | "max": null, 2875 | "min": null, 2876 | "show": true 2877 | } 2878 | ], 2879 | "yaxis": { 2880 | "align": false, 2881 | "alignLevel": null 2882 | } 2883 | } 2884 | ], 2885 | "refresh": "5m", 2886 | "schemaVersion": 26, 2887 | "style": "dark", 2888 | "tags": [], 2889 | "templating": { 2890 | "list": [ 2891 | { 2892 | "current": { 2893 | "selected": false, 2894 | "text": "github.com/muesli/gitflux", 2895 | "value": "github.com/muesli/gitflux" 2896 | }, 2897 | "hide": 0, 2898 | "label": "Repository", 2899 | "name": "repository", 2900 | "options": [ 2901 | { 2902 | "selected": false, 2903 | "text": "github.com/muesli/gitflux", 2904 | "value": "github.com/muesli/gitflux" 2905 | } 2906 | ], 2907 | "query": "github.com/muesli/gitflux", 2908 | "skipUrlSync": false, 2909 | "type": "textbox" 2910 | } 2911 | ] 2912 | }, 2913 | "time": { 2914 | "from": "now-14d", 2915 | "to": "now" 2916 | }, 2917 | "timepicker": { 2918 | "refresh_intervals": [ 2919 | "10s", 2920 | "30s", 2921 | "1m", 2922 | "5m", 2923 | "15m", 2924 | "30m", 2925 | "1h", 2926 | "2h", 2927 | "1d" 2928 | ] 2929 | }, 2930 | "timezone": "", 2931 | "title": "GitHub Project", 2932 | "uid": "23NQ1c5Mj", 2933 | "version": 19 2934 | } 2935 | -------------------------------------------------------------------------------- /issues.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 9 | "github.com/influxdata/influxdb-client-go/v2/api" 10 | "github.com/shurcooL/githubv4" 11 | ) 12 | 13 | type QLLabel struct { 14 | Name githubv4.String 15 | } 16 | 17 | type QLIssue struct { 18 | Title githubv4.String 19 | State githubv4.IssueState 20 | Assignees struct { 21 | Edges []struct { 22 | Node QLUser 23 | } 24 | } `graphql:"assignees(first: 100)"` 25 | Labels struct { 26 | Edges []struct { 27 | Node QLLabel 28 | } 29 | } `graphql:"labels(first: 100)"` 30 | } 31 | 32 | type Issue struct { 33 | Title string 34 | Open bool 35 | Assignees []User 36 | Labels []string 37 | } 38 | 39 | var issuesQuery struct { 40 | Repository struct { 41 | Issues struct { 42 | TotalCount githubv4.Int 43 | Edges []struct { 44 | Cursor githubv4.String 45 | Node QLIssue 46 | } 47 | } `graphql:"issues(first: 100, after:$after)"` 48 | 49 | /* 50 | OpenIssues struct { 51 | TotalCount githubv4.Int 52 | } `graphql:"filterBy: {states: OPEN}"` 53 | */ 54 | } `graphql:"repository(owner: $owner, name: $name)"` 55 | } 56 | 57 | func issues(owner string, name string) ([]Issue, error) { 58 | var after *githubv4.String 59 | var issues []Issue 60 | 61 | for { 62 | variables := map[string]interface{}{ 63 | "owner": githubv4.String(owner), 64 | "name": githubv4.String(name), 65 | "after": after, 66 | } 67 | 68 | if err := queryWithRetry(context.Background(), &issuesQuery, variables); err != nil { 69 | return nil, err 70 | } 71 | if len(issuesQuery.Repository.Issues.Edges) == 0 { 72 | break 73 | } 74 | 75 | for _, v := range issuesQuery.Repository.Issues.Edges { 76 | issues = append(issues, IssueFromQL(v.Node)) 77 | 78 | after = &v.Cursor 79 | } 80 | } 81 | 82 | return issues, nil 83 | } 84 | 85 | func IssueFromQL(issue QLIssue) Issue { 86 | var labels []string 87 | for _, v := range issue.Labels.Edges { 88 | labels = append(labels, string(v.Node.Name)) 89 | } 90 | 91 | var assignees []User 92 | for _, v := range issue.Assignees.Edges { 93 | assignees = append(assignees, UserFromQL(v.Node)) 94 | } 95 | 96 | return Issue{ 97 | Title: string(issue.Title), 98 | Open: issue.State == githubv4.IssueStateOpen, 99 | Assignees: assignees, 100 | Labels: labels, 101 | } 102 | } 103 | 104 | func parseIssues(r Repo, w api.WriteAPIBlocking) error { 105 | fmt.Printf("\tFinding issues for repo...\n") 106 | is, err := issues(r.Owner, r.Name) 107 | if err != nil { 108 | return err 109 | } 110 | fmt.Printf("\tFound %d issues!\n", len(is)) 111 | 112 | open := 0 113 | assignees := map[string]int{} 114 | assigneesOpen := map[string]int{} 115 | labels := map[string]int{} 116 | labelsOpen := map[string]int{} 117 | for _, v := range is { 118 | if v.Open { 119 | open++ 120 | for _, l := range v.Labels { 121 | labelsOpen[l]++ 122 | } 123 | for _, a := range v.Assignees { 124 | assigneesOpen[a.Login]++ 125 | } 126 | } 127 | 128 | for _, l := range v.Labels { 129 | labels[l]++ 130 | } 131 | for _, a := range v.Assignees { 132 | assignees[a.Login]++ 133 | } 134 | } 135 | 136 | p := influxdb2.NewPointWithMeasurement("issues"). 137 | AddTag("repo", "github.com/"+r.NameWithOwner). 138 | AddField("total", len(is)). 139 | AddField("open", open). 140 | SetTime(time.Now()) 141 | err = w.WritePoint(context.Background(), p) 142 | if err != nil { 143 | return err 144 | } 145 | 146 | for k, v := range labels { 147 | p = influxdb2.NewPointWithMeasurement("issues_labels"). 148 | AddTag("repo", "github.com/"+r.NameWithOwner). 149 | AddTag("name", k). 150 | AddField("total", v). 151 | AddField("open", labelsOpen[k]). 152 | SetTime(time.Now()) 153 | err = w.WritePoint(context.Background(), p) 154 | if err != nil { 155 | return err 156 | } 157 | } 158 | 159 | for k, v := range assignees { 160 | p = influxdb2.NewPointWithMeasurement("issues_assignees"). 161 | AddTag("repo", "github.com/"+r.NameWithOwner). 162 | AddTag("name", k). 163 | AddField("total", v). 164 | AddField("open", assigneesOpen[k]). 165 | SetTime(time.Now()) 166 | err = w.WritePoint(context.Background(), p) 167 | if err != nil { 168 | return err 169 | } 170 | } 171 | 172 | return nil 173 | } 174 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "net/http" 7 | "os" 8 | "strings" 9 | "time" 10 | 11 | "github.com/google/go-github/v32/github" 12 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 13 | "github.com/influxdata/influxdb-client-go/v2/api" 14 | "github.com/shurcooL/githubv4" 15 | "github.com/spf13/cobra" 16 | "golang.org/x/oauth2" 17 | ) 18 | 19 | var ( 20 | influx string 21 | influxToken string 22 | influxBucket string 23 | 24 | influxWriter api.WriteAPIBlocking 25 | client *githubv4.Client 26 | clientv3 *github.Client 27 | username string 28 | 29 | rootCmd = &cobra.Command{ 30 | Use: "gitflux", 31 | Short: "Track your GitHub projects in influx", 32 | SilenceErrors: true, 33 | SilenceUsage: true, 34 | // TraverseChildren: true, 35 | PersistentPreRunE: initConnections, 36 | } 37 | ) 38 | 39 | func initConnections(cmd *cobra.Command, args []string) error { 40 | var httpClient *http.Client 41 | token := os.Getenv("GITHUB_TOKEN") 42 | if len(token) == 0 { 43 | return fmt.Errorf("Please set your GITHUB_TOKEN env var") 44 | } 45 | 46 | ts := oauth2.StaticTokenSource( 47 | &oauth2.Token{AccessToken: token}, 48 | ) 49 | 50 | httpClient = oauth2.NewClient(context.Background(), ts) 51 | client = githubv4.NewClient(httpClient) 52 | 53 | tc := oauth2.NewClient(context.Background(), ts) 54 | clientv3 = github.NewClient(tc) 55 | 56 | var err error 57 | username, err = getUsername() 58 | if err != nil { 59 | return fmt.Errorf("Can't retrieve GitHub profile: %s", err) 60 | } 61 | 62 | // Create a new client using an InfluxDB server base URL and an authentication token 63 | idb := influxdb2.NewClient(influx, influxToken) 64 | // defer idb.Close() 65 | 66 | // Use blocking write client for writes to desired bucket 67 | influxWriter = idb.WriteAPIBlocking("", influxBucket) 68 | 69 | return nil 70 | } 71 | 72 | func queryWithRetry(ctx context.Context, q interface{}, variables map[string]interface{}) error { 73 | if err := client.Query(context.Background(), q, variables); err != nil { 74 | if strings.Contains(err.Error(), "abuse-rate-limits") { 75 | time.Sleep(time.Minute) 76 | return queryWithRetry(ctx, q, variables) 77 | } 78 | } 79 | 80 | return nil 81 | } 82 | 83 | func main() { 84 | if err := rootCmd.Execute(); err != nil { 85 | fmt.Println(err) 86 | os.Exit(1) 87 | } 88 | } 89 | 90 | func init() { 91 | rootCmd.PersistentFlags().StringVar(&influx, "influx", "http://localhost:8086", "InfluxDB address") 92 | rootCmd.PersistentFlags().StringVar(&influxToken, "influx-token", "", "InfluxDB auth token") 93 | rootCmd.PersistentFlags().StringVar(&influxBucket, "influx-bucket", "github", "InfluxDB bucket") 94 | } 95 | -------------------------------------------------------------------------------- /notifications_cmd.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | "github.com/google/go-github/v32/github" 9 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 10 | "github.com/influxdata/influxdb-client-go/v2/api" 11 | "github.com/spf13/cobra" 12 | ) 13 | 14 | var ( 15 | notificationsCmd = &cobra.Command{ 16 | Use: "notifications", 17 | Short: "tracks unread notifications", 18 | RunE: func(cmd *cobra.Command, args []string) error { 19 | return parseNotifications(influxWriter) 20 | }, 21 | } 22 | ) 23 | 24 | func parseNotifications(w api.WriteAPIBlocking) error { 25 | fmt.Printf("Finding notifications for user...\n") 26 | 27 | total := 0 28 | unread := 0 29 | 30 | opt := &github.NotificationListOptions{ 31 | ListOptions: github.ListOptions{ 32 | PerPage: 50, 33 | }, 34 | } 35 | for { 36 | notifications, resp, err := clientv3.Activity.ListNotifications(context.Background(), opt) 37 | if err != nil { 38 | return err 39 | } 40 | 41 | for _, v := range notifications { 42 | total++ 43 | if *v.Unread { 44 | unread++ 45 | } 46 | } 47 | 48 | if resp.NextPage == 0 || len(notifications) == 0 { 49 | break 50 | } 51 | opt.Page = resp.NextPage 52 | } 53 | fmt.Printf("Found %d total, %d unread notifications\n", total, unread) 54 | 55 | p := influxdb2.NewPointWithMeasurement("notifications"). 56 | AddTag("user", username). 57 | AddField("value", unread). 58 | SetTime(time.Now()) 59 | return w.WritePoint(context.Background(), p) 60 | } 61 | 62 | func init() { 63 | rootCmd.AddCommand(notificationsCmd) 64 | } 65 | -------------------------------------------------------------------------------- /pr.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 9 | "github.com/influxdata/influxdb-client-go/v2/api" 10 | "github.com/shurcooL/githubv4" 11 | ) 12 | 13 | type QLPullRequest struct { 14 | Title githubv4.String 15 | State githubv4.PullRequestState 16 | Assignees struct { 17 | Edges []struct { 18 | Node QLUser 19 | } 20 | } `graphql:"assignees(first: 100)"` 21 | Labels struct { 22 | Edges []struct { 23 | Node QLLabel 24 | } 25 | } `graphql:"labels(first: 100)"` 26 | } 27 | 28 | type PullRequest struct { 29 | Title string 30 | Open bool 31 | Merged bool 32 | Assignees []User 33 | Labels []string 34 | } 35 | 36 | var pullRequestsQuery struct { 37 | Repository struct { 38 | PullRequests struct { 39 | TotalCount githubv4.Int 40 | Edges []struct { 41 | Cursor githubv4.String 42 | Node QLPullRequest 43 | } 44 | } `graphql:"pullRequests(first: 100, after:$after)"` 45 | } `graphql:"repository(owner: $owner, name: $name)"` 46 | } 47 | 48 | func pullRequests(owner string, name string) ([]PullRequest, error) { 49 | var after *githubv4.String 50 | var prs []PullRequest 51 | 52 | for { 53 | variables := map[string]interface{}{ 54 | "owner": githubv4.String(owner), 55 | "name": githubv4.String(name), 56 | "after": after, 57 | } 58 | 59 | if err := queryWithRetry(context.Background(), &pullRequestsQuery, variables); err != nil { 60 | return nil, err 61 | } 62 | if len(pullRequestsQuery.Repository.PullRequests.Edges) == 0 { 63 | break 64 | } 65 | 66 | for _, v := range pullRequestsQuery.Repository.PullRequests.Edges { 67 | prs = append(prs, PullRequestFromQL(v.Node)) 68 | 69 | after = &v.Cursor 70 | } 71 | } 72 | 73 | return prs, nil 74 | } 75 | 76 | func PullRequestFromQL(pr QLPullRequest) PullRequest { 77 | var labels []string 78 | for _, v := range pr.Labels.Edges { 79 | labels = append(labels, string(v.Node.Name)) 80 | } 81 | 82 | var assignees []User 83 | for _, v := range pr.Assignees.Edges { 84 | assignees = append(assignees, UserFromQL(v.Node)) 85 | } 86 | 87 | return PullRequest{ 88 | Title: string(pr.Title), 89 | Open: pr.State == githubv4.PullRequestStateOpen, 90 | Merged: pr.State == githubv4.PullRequestStateMerged, 91 | Assignees: assignees, 92 | Labels: labels, 93 | } 94 | } 95 | 96 | func parsePullRequests(r Repo, w api.WriteAPIBlocking) error { 97 | fmt.Printf("\tFinding PRs for repo...\n") 98 | prs, err := pullRequests(r.Owner, r.Name) 99 | if err != nil { 100 | return err 101 | } 102 | fmt.Printf("\tFound %d PRs!\n", len(prs)) 103 | 104 | open := 0 105 | merged := 0 106 | assignees := map[string]int{} 107 | assigneesOpen := map[string]int{} 108 | assigneesMerged := map[string]int{} 109 | labels := map[string]int{} 110 | labelsOpen := map[string]int{} 111 | labelsMerged := map[string]int{} 112 | for _, v := range prs { 113 | if v.Open { 114 | open++ 115 | for _, l := range v.Labels { 116 | labelsOpen[l]++ 117 | } 118 | for _, a := range v.Assignees { 119 | assigneesOpen[a.Login]++ 120 | } 121 | } 122 | if v.Merged { 123 | merged++ 124 | for _, l := range v.Labels { 125 | labelsMerged[l]++ 126 | } 127 | for _, a := range v.Assignees { 128 | assigneesMerged[a.Login]++ 129 | } 130 | } 131 | 132 | for _, l := range v.Labels { 133 | labels[l]++ 134 | } 135 | for _, a := range v.Assignees { 136 | assignees[a.Login]++ 137 | } 138 | } 139 | 140 | p := influxdb2.NewPointWithMeasurement("pullrequests"). 141 | AddTag("repo", "github.com/"+r.NameWithOwner). 142 | AddField("total", len(prs)). 143 | AddField("open", open). 144 | AddField("merged", merged). 145 | SetTime(time.Now()) 146 | err = w.WritePoint(context.Background(), p) 147 | if err != nil { 148 | return err 149 | } 150 | 151 | for k, v := range labels { 152 | p = influxdb2.NewPointWithMeasurement("pullrequests_labels"). 153 | AddTag("repo", "github.com/"+r.NameWithOwner). 154 | AddTag("name", k). 155 | AddField("total", v). 156 | AddField("merged", labelsMerged[k]). 157 | AddField("open", labelsOpen[k]). 158 | SetTime(time.Now()) 159 | err = w.WritePoint(context.Background(), p) 160 | if err != nil { 161 | return err 162 | } 163 | } 164 | 165 | for k, v := range assignees { 166 | p = influxdb2.NewPointWithMeasurement("pullrequests_assignees"). 167 | AddTag("repo", "github.com/"+r.NameWithOwner). 168 | AddTag("name", k). 169 | AddField("total", v). 170 | AddField("merged", assigneesMerged[k]). 171 | AddField("open", assigneesOpen[k]). 172 | SetTime(time.Now()) 173 | err = w.WritePoint(context.Background(), p) 174 | if err != nil { 175 | return err 176 | } 177 | } 178 | 179 | return nil 180 | } 181 | -------------------------------------------------------------------------------- /relationships_cmd.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 9 | "github.com/influxdata/influxdb-client-go/v2/api" 10 | "github.com/spf13/cobra" 11 | ) 12 | 13 | var ( 14 | relationshipsCmd = &cobra.Command{ 15 | Use: "relationships", 16 | Short: "tracks user relationships", 17 | RunE: func(cmd *cobra.Command, args []string) error { 18 | return parseRelationships(influxWriter) 19 | }, 20 | } 21 | ) 22 | 23 | func parseRelationships(w api.WriteAPIBlocking) error { 24 | fmt.Printf("Finding relationships for user...\n") 25 | f, err := followers() 26 | if err != nil { 27 | return err 28 | } 29 | fmt.Printf("Found %d followers\n", f) 30 | 31 | p := influxdb2.NewPointWithMeasurement("followers"). 32 | AddTag("user", username). 33 | AddField("value", f). 34 | SetTime(time.Now()) 35 | return w.WritePoint(context.Background(), p) 36 | } 37 | 38 | func init() { 39 | rootCmd.AddCommand(relationshipsCmd) 40 | } 41 | -------------------------------------------------------------------------------- /repos.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "time" 6 | 7 | "github.com/shurcooL/githubv4" 8 | ) 9 | 10 | var reposQuery struct { 11 | User struct { 12 | Login githubv4.String 13 | Repositories struct { 14 | TotalCount githubv4.Int 15 | Edges []struct { 16 | Cursor githubv4.String 17 | Node QLRepository 18 | } 19 | } `graphql:"repositories(first: 100, after:$after privacy: PUBLIC, isFork: false, ownerAffiliations: OWNER, orderBy: {field: CREATED_AT, direction: DESC})"` 20 | } `graphql:"repositoryOwner(login:$username)"` 21 | } 22 | 23 | var repoQuery struct { 24 | Repository QLRepository `graphql:"repository(owner: $owner, name: $name)"` 25 | } 26 | 27 | func repository(owner string, name string) (Repo, error) { 28 | variables := map[string]interface{}{ 29 | "owner": githubv4.String(owner), 30 | "name": githubv4.String(name), 31 | } 32 | 33 | if err := queryWithRetry(context.Background(), &repoQuery, variables); err != nil { 34 | return Repo{}, err 35 | } 36 | 37 | return RepoFromQL(repoQuery.Repository), nil 38 | } 39 | 40 | func repositories(owner string) ([]Repo, error) { 41 | var after *githubv4.String 42 | var repos []Repo 43 | 44 | for { 45 | variables := map[string]interface{}{ 46 | "username": githubv4.String(owner), 47 | "after": after, 48 | } 49 | 50 | if err := queryWithRetry(context.Background(), &reposQuery, variables); err != nil { 51 | return nil, err 52 | } 53 | if len(reposQuery.User.Repositories.Edges) == 0 { 54 | break 55 | } 56 | 57 | for _, v := range reposQuery.User.Repositories.Edges { 58 | repos = append(repos, RepoFromQL(v.Node)) 59 | 60 | after = &v.Cursor 61 | } 62 | } 63 | 64 | return repos, nil 65 | } 66 | 67 | type QLRepository struct { 68 | Owner struct { 69 | Login githubv4.String 70 | } 71 | Name githubv4.String 72 | NameWithOwner githubv4.String 73 | URL githubv4.String 74 | Description githubv4.String 75 | IsPrivate githubv4.Boolean 76 | ForkCount githubv4.Int 77 | StargazerCount githubv4.Int 78 | 79 | Watchers struct { 80 | TotalCount githubv4.Int 81 | } 82 | 83 | BranchEntity struct { 84 | Commits struct { 85 | History struct { 86 | TotalCount githubv4.Int 87 | } 88 | } `graphql:"... on Commit"` 89 | } `graphql:"object(expression: \"HEAD\")"` 90 | } 91 | 92 | type Repo struct { 93 | Owner string 94 | Name string 95 | NameWithOwner string 96 | URL string 97 | Description string 98 | Stargazers int 99 | Watchers int 100 | Forks int 101 | Commits int 102 | LastRelease Release 103 | } 104 | 105 | type Release struct { 106 | Name string 107 | TagName string 108 | PublishedAt time.Time 109 | URL string 110 | } 111 | 112 | func RepoFromQL(repo QLRepository) Repo { 113 | return Repo{ 114 | Owner: string(repo.Owner.Login), 115 | Name: string(repo.Name), 116 | NameWithOwner: string(repo.NameWithOwner), 117 | URL: string(repo.URL), 118 | Description: string(repo.Description), 119 | Stargazers: int(repo.StargazerCount), 120 | Watchers: int(repo.Watchers.TotalCount), 121 | Forks: int(repo.ForkCount), 122 | Commits: int(repo.BranchEntity.Commits.History.TotalCount), 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /repository_cmd.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "strings" 7 | "time" 8 | 9 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 10 | "github.com/influxdata/influxdb-client-go/v2/api" 11 | "github.com/spf13/cobra" 12 | ) 13 | 14 | var ( 15 | repositoryCmd = &cobra.Command{ 16 | Use: "repository [owner OR owner/repo]", 17 | Short: "tracks repositories", 18 | RunE: func(cmd *cobra.Command, args []string) error { 19 | var repos []Repo 20 | 21 | if len(args) > 0 { 22 | if strings.Contains(args[0], "/") { 23 | as := strings.Split(args[0], "/") 24 | r, err := repository(as[0], as[1]) 25 | if err != nil { 26 | return err 27 | } 28 | 29 | repos = append(repos, r) 30 | } else { 31 | org := args[0] 32 | fmt.Printf("Finding %s's source repos...\n", org) 33 | var err error 34 | repos, err = repositories(org) 35 | if err != nil { 36 | return err 37 | } 38 | fmt.Printf("Found %d repos\n", len(repos)) 39 | } 40 | } else { 41 | // fetch all user source repositories per default 42 | fmt.Printf("Finding user's source repos...\n") 43 | var err error 44 | repos, err = repositories(username) 45 | if err != nil { 46 | return err 47 | } 48 | fmt.Printf("Found %d repos\n", len(repos)) 49 | } 50 | 51 | return parseRepos(repos, influxWriter) 52 | }, 53 | } 54 | ) 55 | 56 | func parseRepos(repos []Repo, w api.WriteAPIBlocking) error { 57 | for _, r := range repos { 58 | fmt.Printf("Parsing %s\n", r.NameWithOwner) 59 | 60 | p := influxdb2.NewPointWithMeasurement("stars"). 61 | AddTag("repo", "github.com/"+r.NameWithOwner). 62 | AddField("value", r.Stargazers). 63 | SetTime(time.Now()) 64 | err := w.WritePoint(context.Background(), p) 65 | if err != nil { 66 | return err 67 | } 68 | 69 | p = influxdb2.NewPointWithMeasurement("watchers"). 70 | AddTag("repo", "github.com/"+r.NameWithOwner). 71 | AddField("value", r.Watchers). 72 | SetTime(time.Now()) 73 | err = w.WritePoint(context.Background(), p) 74 | if err != nil { 75 | return err 76 | } 77 | 78 | p = influxdb2.NewPointWithMeasurement("forks"). 79 | AddTag("repo", "github.com/"+r.NameWithOwner). 80 | AddField("value", r.Forks). 81 | SetTime(time.Now()) 82 | err = w.WritePoint(context.Background(), p) 83 | if err != nil { 84 | return err 85 | } 86 | 87 | p = influxdb2.NewPointWithMeasurement("commits"). 88 | AddTag("repo", "github.com/"+r.NameWithOwner). 89 | AddField("value", r.Commits). 90 | SetTime(time.Now()) 91 | err = w.WritePoint(context.Background(), p) 92 | if err != nil { 93 | return err 94 | } 95 | 96 | // parse PRs 97 | err = parsePullRequests(r, w) 98 | if err != nil { 99 | return err 100 | } 101 | // parse issues 102 | err = parseIssues(r, w) 103 | if err != nil { 104 | return err 105 | } 106 | } 107 | 108 | return nil 109 | } 110 | 111 | func init() { 112 | rootCmd.AddCommand(repositoryCmd) 113 | } 114 | -------------------------------------------------------------------------------- /screenshots/project_commits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_commits.png -------------------------------------------------------------------------------- /screenshots/project_forks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_forks.png -------------------------------------------------------------------------------- /screenshots/project_issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_issues.png -------------------------------------------------------------------------------- /screenshots/project_issues_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_issues_labels.png -------------------------------------------------------------------------------- /screenshots/project_issues_labels_bars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_issues_labels_bars.png -------------------------------------------------------------------------------- /screenshots/project_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_prs.png -------------------------------------------------------------------------------- /screenshots/project_prs_labels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_prs_labels.png -------------------------------------------------------------------------------- /screenshots/project_prs_labels_bars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_prs_labels_bars.png -------------------------------------------------------------------------------- /screenshots/project_stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_stars.png -------------------------------------------------------------------------------- /screenshots/project_watchers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/project_watchers.png -------------------------------------------------------------------------------- /screenshots/repo_commits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_commits.png -------------------------------------------------------------------------------- /screenshots/repo_forks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_forks.png -------------------------------------------------------------------------------- /screenshots/repo_issues.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_issues.png -------------------------------------------------------------------------------- /screenshots/repo_prs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_prs.png -------------------------------------------------------------------------------- /screenshots/repo_stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_stars.png -------------------------------------------------------------------------------- /screenshots/repo_watchers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/repo_watchers.png -------------------------------------------------------------------------------- /screenshots/user_followers.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/user_followers.png -------------------------------------------------------------------------------- /screenshots/user_notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/muesli/gitflux/60efe748d06f80428421ecc74739534240b53fcb/screenshots/user_notifications.png -------------------------------------------------------------------------------- /sponsors.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/shurcooL/githubv4" 7 | ) 8 | 9 | var sponsorsQuery struct { 10 | Viewer struct { 11 | SponsorshipAsMaintainer struct { 12 | TotalCount githubv4.Int 13 | } `graphql:"sponsorshipsAsMaintainer(first: 100, orderBy: {field: CREATED_AT, direction: DESC})"` 14 | } 15 | } 16 | 17 | func sponsors() (int, error) { 18 | if err := queryWithRetry(context.Background(), &sponsorsQuery, map[string]interface{}{}); err != nil { 19 | return 0, err 20 | } 21 | 22 | return int(sponsorsQuery.Viewer.SponsorshipAsMaintainer.TotalCount), nil 23 | } 24 | -------------------------------------------------------------------------------- /sponsors_cmd.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "fmt" 6 | "time" 7 | 8 | influxdb2 "github.com/influxdata/influxdb-client-go/v2" 9 | "github.com/influxdata/influxdb-client-go/v2/api" 10 | "github.com/spf13/cobra" 11 | ) 12 | 13 | var sponsorsCmd = &cobra.Command{ 14 | Use: "sponsors", 15 | Short: "tracks user sponsors", 16 | RunE: func(cmd *cobra.Command, args []string) error { 17 | return parseSponsors(influxWriter) 18 | }, 19 | } 20 | 21 | func parseSponsors(w api.WriteAPIBlocking) error { 22 | fmt.Printf("Finding sponsors for user...\n") 23 | s, err := sponsors() 24 | if err != nil { 25 | return err 26 | } 27 | fmt.Printf("Found %d sponsors\n", s) 28 | 29 | p := influxdb2.NewPointWithMeasurement("sponsors"). 30 | AddTag("user", username). 31 | AddField("value", s). 32 | SetTime(time.Now()) 33 | return w.WritePoint(context.Background(), p) 34 | } 35 | 36 | func init() { 37 | rootCmd.AddCommand(sponsorsCmd) 38 | } 39 | -------------------------------------------------------------------------------- /users.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/shurcooL/githubv4" 7 | ) 8 | 9 | type QLUser struct { 10 | Login githubv4.String 11 | Name githubv4.String 12 | AvatarURL githubv4.String 13 | URL githubv4.String 14 | } 15 | 16 | type User struct { 17 | Login string 18 | Name string 19 | AvatarURL string 20 | URL string 21 | } 22 | 23 | var viewerQuery struct { 24 | Viewer struct { 25 | Login githubv4.String 26 | } 27 | } 28 | 29 | func getUsername() (string, error) { 30 | if err := queryWithRetry(context.Background(), &viewerQuery, nil); err != nil { 31 | return "", err 32 | } 33 | 34 | return string(viewerQuery.Viewer.Login), nil 35 | } 36 | 37 | var followersQuery struct { 38 | User struct { 39 | Login githubv4.String 40 | Followers struct { 41 | TotalCount githubv4.Int 42 | } 43 | } `graphql:"user(login:$username)"` 44 | } 45 | 46 | func followers() (int, error) { 47 | variables := map[string]interface{}{ 48 | "username": githubv4.String(username), 49 | } 50 | if err := queryWithRetry(context.Background(), &followersQuery, variables); err != nil { 51 | return 0, err 52 | } 53 | 54 | return int(followersQuery.User.Followers.TotalCount), nil 55 | } 56 | 57 | func UserFromQL(user QLUser) User { 58 | return User{ 59 | Login: string(user.Login), 60 | Name: string(user.Name), 61 | AvatarURL: string(user.AvatarURL), 62 | URL: string(user.URL), 63 | } 64 | } 65 | --------------------------------------------------------------------------------