├── .gitignore ├── requirements.txt ├── images ├── final.png ├── first.png ├── 2-json.png ├── 3-file.png ├── first-dash.png └── importjson.png ├── telegraf.d └── custom.conf ├── dnac_config.py ├── LICENSE ├── dnac_assurance.py ├── README.MD └── grafana └── dashboard.json /.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__/ 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | dnacentersdk -------------------------------------------------------------------------------- /images/final.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/final.png -------------------------------------------------------------------------------- /images/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/first.png -------------------------------------------------------------------------------- /images/2-json.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/2-json.png -------------------------------------------------------------------------------- /images/3-file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/3-file.png -------------------------------------------------------------------------------- /images/first-dash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/first-dash.png -------------------------------------------------------------------------------- /images/importjson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CiscoDevNet/DNAC-NOC/HEAD/images/importjson.png -------------------------------------------------------------------------------- /telegraf.d/custom.conf: -------------------------------------------------------------------------------- 1 | [[inputs.exec]] 2 | command = "/opt/telegraf/env3/bin/python /opt/telegraf/DNAC-NOC/dnac_assurance.py" 3 | data_format = "json" 4 | name_suffix = "_dnac" 5 | interval = "1m" -------------------------------------------------------------------------------- /dnac_config.py: -------------------------------------------------------------------------------- 1 | import os 2 | DNAC= os.getenv("DNAC") or "sandboxdnac2.cisco.com" 3 | DNAC_USER= os.getenv("DNAC_USER") or "devnetuser" 4 | DNAC_PORT=os.getenv("DNAC_PORT") or 8080 5 | DNAC_PASSWORD= os.getenv("DNAC_PASSWORD") or "Cisco123!" -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019, Cisco Systems, Inc. and/or its affiliates 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 | -------------------------------------------------------------------------------- /dnac_assurance.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | from __future__ import print_function 3 | import time 4 | import json 5 | import requests 6 | # turn off warninggs 7 | requests.packages.urllib3.disable_warnings() 8 | from dnac_config import DNAC, DNAC_USER, DNAC_PASSWORD 9 | 10 | from dnacentersdk import api 11 | 12 | dnac = api.DNACenterAPI(base_url='https://{}:443'.format(DNAC), 13 | username=DNAC_USER,password=DNAC_PASSWORD,verify=False,version="1.3.0") 14 | 15 | network_health= dnac.networks.get_overall_network_health(timestamp='') 16 | #print (json.dumps(network_health,indent=2)) 17 | 18 | timestamp = int(time.time() * 1000) 19 | client_health= dnac.clients.get_overall_client_health(timestamp='{}'.format(timestamp)) 20 | #print(json.dumps(client_health,indent=2)) 21 | 22 | result={} 23 | for score in network_health.response: 24 | result["totalscore"] = score.healthScore 25 | result["totalcount"] = score.totalCount 26 | for health in network_health.healthDistirubution: 27 | result[health.category+".score"] = health.healthScore 28 | result[health.category + ".count"] = health.count 29 | for score in client_health.response[0].scoreDetail: 30 | result[score.scoreCategory.value+"-client.value"] = value=score.scoreValue 31 | result[score.scoreCategory.value+"-client.count"]= score.clientCount 32 | 33 | print(json.dumps(result)) -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Network Operations Center Dashboard 2 | 3 | I am assuming you have TIG (Telegraf/Influx/Grafana) setup for general dashboard purposes. This is really simplle to setup 4 | and there are lots of blogs on this. 5 | 6 | ### Setup The Custom Script 7 | 8 | The script is going to call DNAC API via the newly released SDK. 9 | 10 | I am going to assume a directory /opt/telegraf. 11 | If you want to install elsewhere you need to change the paths in the custom.conf file. 12 | 13 | First (optional) step, create a vitualenv. This makes it less likely to clash with other python libraries in future. 14 | Once the virtualenv is created, need to activate it. 15 | ```buildoutcfg 16 | python3 -mvenv env3 17 | source env3/bin/activate 18 | ``` 19 | 20 | Next clone the code. 21 | 22 | ```buildoutcfg 23 | git clone https://github.com/CiscoDevNet/DNAC-NOC.git 24 | ``` 25 | 26 | Then install the requirements (after upgrading pip). 27 | Older versions of pip may not install the requirements correctly. 28 | ```buildoutcfg 29 | pip install -U pip 30 | pip install -r DNAC-NOC/requirements.txt 31 | ``` 32 | ### Credentials/Run the Script 33 | By default the script uses the devnet sandbox. If you want to change these you can edit the dnac_config.py file. 34 | You are able to either edit the defaults, or use environment variables if you are familiar with them. 35 | 36 | Finallly, test the script. 37 | Should see something like this. 38 | You can edit the dnac_config.py file to change the DNAC you are connecting to. The default is a devnet sandbox. 39 | ``` 40 | $ ./DNAC-NOC/dnac_assurance.py 41 | {"Core.count": null, "totalcount": 14, "WIRELESS-client.count": 80, "WLC.count": null, 42 | "WIRED-client.count": 2, "AP.count": null, "WIRED-client.value": 100, "Access.count": null, 43 | "totalscore": 100, "WIRELESS-client.value": 25, "AP.score": 100, "Router.score": 100, 44 | "ALL-client.value": 27, "Router.count": null, 45 | "Access.score": 100, "Core.score": 100, "WLC.score": 100, "ALL-client.count": 82} 46 | ``` 47 | ### Get Telegraf to use the custom script 48 | Now install the telegraf custom script, restart telegraf. 49 | ```buildoutcfg 50 | sudo cp DNAC-NOC/telegraf.d/custom.conf /etc/telegraf/telegraf.d/ 51 | sudo systemctl restart telegraf 52 | ``` 53 | 54 | ### Import Dashboard Definition in Grafana 55 | log into grafana, select + create -> import 56 | ![json](images/first.png?raw=true "Import JSON") 57 | 58 | ![json](images/2-json.png?raw=true "Import JSON") 59 | 60 | Select the jsonfile grafana/dashboard.json 61 | ![json](images/3-file.png?raw=true "Import JSON") 62 | 63 | Then add the dashboard 64 | ![json](images/importjson.png?raw=true "Import JSON") 65 | 66 | This will give you an empty dashboard. 67 | ![json](images/first-dash.png?raw=true "First Dashbaord") 68 | 69 | Soon you wil see updated data 70 | ![json](images/final.png?raw=true "First Dashbaord") 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /grafana/dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "annotations": { 3 | "list": [ 4 | { 5 | "builtIn": 1, 6 | "datasource": "-- Grafana --", 7 | "enable": true, 8 | "hide": true, 9 | "iconColor": "rgba(0, 211, 255, 1)", 10 | "name": "Annotations & Alerts", 11 | "type": "dashboard" 12 | } 13 | ] 14 | }, 15 | "editable": true, 16 | "gnetId": null, 17 | "graphTooltip": 0, 18 | "id": 3, 19 | "links": [ 20 | { 21 | "icon": "external link", 22 | "tags": [], 23 | "type": "dashboards" 24 | } 25 | ], 26 | "panels": [ 27 | { 28 | "aliasColors": {}, 29 | "bars": false, 30 | "dashLength": 10, 31 | "dashes": false, 32 | "datasource": "InfluxDB", 33 | "fill": 1, 34 | "fillGradient": 0, 35 | "gridPos": { 36 | "h": 8, 37 | "w": 12, 38 | "x": 0, 39 | "y": 0 40 | }, 41 | "id": 12, 42 | "legend": { 43 | "avg": false, 44 | "current": false, 45 | "max": false, 46 | "min": false, 47 | "show": true, 48 | "total": false, 49 | "values": false 50 | }, 51 | "lines": true, 52 | "linewidth": 1, 53 | "links": [ 54 | { 55 | "title": "", 56 | "url": "" 57 | } 58 | ], 59 | "nullPointMode": "null", 60 | "options": { 61 | "dataLinks": [] 62 | }, 63 | "percentage": false, 64 | "pointradius": 2, 65 | "points": false, 66 | "renderer": "flot", 67 | "seriesOverrides": [], 68 | "spaceLength": 10, 69 | "stack": false, 70 | "steppedLine": false, 71 | "targets": [ 72 | { 73 | "alias": "RouterHealth", 74 | "groupBy": [ 75 | { 76 | "params": [ 77 | "$__interval" 78 | ], 79 | "type": "time" 80 | }, 81 | { 82 | "params": [ 83 | "linear" 84 | ], 85 | "type": "fill" 86 | } 87 | ], 88 | "measurement": "exec_dnac", 89 | "orderByTime": "ASC", 90 | "policy": "default", 91 | "refId": "A", 92 | "resultFormat": "time_series", 93 | "select": [ 94 | [ 95 | { 96 | "params": [ 97 | "Router.score" 98 | ], 99 | "type": "field" 100 | }, 101 | { 102 | "params": [], 103 | "type": "mean" 104 | } 105 | ] 106 | ], 107 | "tags": [] 108 | } 109 | ], 110 | "thresholds": [], 111 | "timeFrom": null, 112 | "timeRegions": [], 113 | "timeShift": null, 114 | "title": "Router HealthScore", 115 | "tooltip": { 116 | "shared": true, 117 | "sort": 0, 118 | "value_type": "individual" 119 | }, 120 | "type": "graph", 121 | "xaxis": { 122 | "buckets": null, 123 | "mode": "time", 124 | "name": null, 125 | "show": true, 126 | "values": [] 127 | }, 128 | "yaxes": [ 129 | { 130 | "format": "short", 131 | "label": null, 132 | "logBase": 1, 133 | "max": "100", 134 | "min": "0", 135 | "show": true 136 | }, 137 | { 138 | "format": "short", 139 | "label": null, 140 | "logBase": 1, 141 | "max": null, 142 | "min": null, 143 | "show": true 144 | } 145 | ], 146 | "yaxis": { 147 | "align": false, 148 | "alignLevel": null 149 | } 150 | }, 151 | { 152 | "aliasColors": {}, 153 | "bars": false, 154 | "dashLength": 10, 155 | "dashes": false, 156 | "datasource": "InfluxDB", 157 | "fill": 1, 158 | "fillGradient": 0, 159 | "gridPos": { 160 | "h": 8, 161 | "w": 12, 162 | "x": 12, 163 | "y": 0 164 | }, 165 | "id": 10, 166 | "legend": { 167 | "avg": false, 168 | "current": false, 169 | "max": false, 170 | "min": false, 171 | "show": true, 172 | "total": false, 173 | "values": false 174 | }, 175 | "lines": true, 176 | "linewidth": 1, 177 | "nullPointMode": "null", 178 | "options": { 179 | "dataLinks": [] 180 | }, 181 | "percentage": false, 182 | "pointradius": 2, 183 | "points": false, 184 | "renderer": "flot", 185 | "seriesOverrides": [ 186 | { 187 | "alias": "CLient Count", 188 | "yaxis": 2 189 | } 190 | ], 191 | "spaceLength": 10, 192 | "stack": false, 193 | "steppedLine": false, 194 | "targets": [ 195 | { 196 | "alias": "APHealth", 197 | "groupBy": [ 198 | { 199 | "params": [ 200 | "$__interval" 201 | ], 202 | "type": "time" 203 | }, 204 | { 205 | "params": [ 206 | "linear" 207 | ], 208 | "type": "fill" 209 | } 210 | ], 211 | "measurement": "exec_dnac", 212 | "orderByTime": "ASC", 213 | "policy": "default", 214 | "refId": "A", 215 | "resultFormat": "time_series", 216 | "select": [ 217 | [ 218 | { 219 | "params": [ 220 | "AP.score" 221 | ], 222 | "type": "field" 223 | }, 224 | { 225 | "params": [], 226 | "type": "mean" 227 | } 228 | ] 229 | ], 230 | "tags": [] 231 | }, 232 | { 233 | "alias": "Wireless Client Health", 234 | "groupBy": [ 235 | { 236 | "params": [ 237 | "$__interval" 238 | ], 239 | "type": "time" 240 | }, 241 | { 242 | "params": [ 243 | "linear" 244 | ], 245 | "type": "fill" 246 | } 247 | ], 248 | "measurement": "exec_dnac", 249 | "orderByTime": "ASC", 250 | "policy": "default", 251 | "refId": "B", 252 | "resultFormat": "time_series", 253 | "select": [ 254 | [ 255 | { 256 | "params": [ 257 | "WIRED-client.value" 258 | ], 259 | "type": "field" 260 | }, 261 | { 262 | "params": [], 263 | "type": "mean" 264 | } 265 | ] 266 | ], 267 | "tags": [] 268 | } 269 | ], 270 | "thresholds": [], 271 | "timeFrom": null, 272 | "timeRegions": [], 273 | "timeShift": null, 274 | "title": "AP Health Score", 275 | "tooltip": { 276 | "shared": true, 277 | "sort": 0, 278 | "value_type": "individual" 279 | }, 280 | "type": "graph", 281 | "xaxis": { 282 | "buckets": null, 283 | "mode": "time", 284 | "name": null, 285 | "show": true, 286 | "values": [] 287 | }, 288 | "yaxes": [ 289 | { 290 | "format": "short", 291 | "label": null, 292 | "logBase": 1, 293 | "max": "100", 294 | "min": "0", 295 | "show": true 296 | }, 297 | { 298 | "format": "short", 299 | "label": null, 300 | "logBase": 1, 301 | "max": null, 302 | "min": null, 303 | "show": true 304 | } 305 | ], 306 | "yaxis": { 307 | "align": false, 308 | "alignLevel": null 309 | } 310 | }, 311 | { 312 | "aliasColors": {}, 313 | "bars": false, 314 | "dashLength": 10, 315 | "dashes": false, 316 | "datasource": "InfluxDB", 317 | "fill": 1, 318 | "fillGradient": 0, 319 | "gridPos": { 320 | "h": 8, 321 | "w": 12, 322 | "x": 0, 323 | "y": 8 324 | }, 325 | "id": 6, 326 | "legend": { 327 | "avg": false, 328 | "current": false, 329 | "max": false, 330 | "min": false, 331 | "show": true, 332 | "total": false, 333 | "values": false 334 | }, 335 | "lines": true, 336 | "linewidth": 1, 337 | "nullPointMode": "null", 338 | "options": { 339 | "dataLinks": [] 340 | }, 341 | "percentage": false, 342 | "pointradius": 2, 343 | "points": false, 344 | "renderer": "flot", 345 | "seriesOverrides": [], 346 | "spaceLength": 10, 347 | "stack": false, 348 | "steppedLine": false, 349 | "targets": [ 350 | { 351 | "alias": "Access Health", 352 | "groupBy": [ 353 | { 354 | "params": [ 355 | "$__interval" 356 | ], 357 | "type": "time" 358 | }, 359 | { 360 | "params": [ 361 | "linear" 362 | ], 363 | "type": "fill" 364 | } 365 | ], 366 | "measurement": "exec_dnac", 367 | "orderByTime": "ASC", 368 | "policy": "default", 369 | "refId": "A", 370 | "resultFormat": "time_series", 371 | "select": [ 372 | [ 373 | { 374 | "params": [ 375 | "Access.score" 376 | ], 377 | "type": "field" 378 | }, 379 | { 380 | "params": [], 381 | "type": "mean" 382 | } 383 | ] 384 | ], 385 | "tags": [] 386 | }, 387 | { 388 | "alias": "Wired Client Health", 389 | "groupBy": [ 390 | { 391 | "params": [ 392 | "$__interval" 393 | ], 394 | "type": "time" 395 | }, 396 | { 397 | "params": [ 398 | "linear" 399 | ], 400 | "type": "fill" 401 | } 402 | ], 403 | "measurement": "exec_dnac", 404 | "orderByTime": "ASC", 405 | "policy": "default", 406 | "refId": "B", 407 | "resultFormat": "time_series", 408 | "select": [ 409 | [ 410 | { 411 | "params": [ 412 | "WIRED-client.value" 413 | ], 414 | "type": "field" 415 | }, 416 | { 417 | "params": [], 418 | "type": "mean" 419 | } 420 | ] 421 | ], 422 | "tags": [] 423 | } 424 | ], 425 | "thresholds": [], 426 | "timeFrom": null, 427 | "timeRegions": [], 428 | "timeShift": null, 429 | "title": "Access HealthScore", 430 | "tooltip": { 431 | "shared": true, 432 | "sort": 0, 433 | "value_type": "individual" 434 | }, 435 | "type": "graph", 436 | "xaxis": { 437 | "buckets": null, 438 | "mode": "time", 439 | "name": null, 440 | "show": true, 441 | "values": [] 442 | }, 443 | "yaxes": [ 444 | { 445 | "format": "short", 446 | "label": null, 447 | "logBase": 1, 448 | "max": "100", 449 | "min": "0", 450 | "show": true 451 | }, 452 | { 453 | "format": "short", 454 | "label": null, 455 | "logBase": 1, 456 | "max": null, 457 | "min": null, 458 | "show": true 459 | } 460 | ], 461 | "yaxis": { 462 | "align": false, 463 | "alignLevel": null 464 | } 465 | }, 466 | { 467 | "aliasColors": {}, 468 | "bars": false, 469 | "dashLength": 10, 470 | "dashes": false, 471 | "datasource": "InfluxDB", 472 | "fill": 1, 473 | "fillGradient": 0, 474 | "gridPos": { 475 | "h": 8, 476 | "w": 12, 477 | "x": 12, 478 | "y": 8 479 | }, 480 | "id": 8, 481 | "legend": { 482 | "avg": false, 483 | "current": false, 484 | "max": false, 485 | "min": false, 486 | "show": true, 487 | "total": false, 488 | "values": false 489 | }, 490 | "lines": true, 491 | "linewidth": 1, 492 | "nullPointMode": "null", 493 | "options": { 494 | "dataLinks": [] 495 | }, 496 | "percentage": false, 497 | "pointradius": 2, 498 | "points": false, 499 | "renderer": "flot", 500 | "seriesOverrides": [ 501 | { 502 | "alias": "Wireless Clients", 503 | "yaxis": 2 504 | }, 505 | { 506 | "alias": "Wireless Client Count", 507 | "yaxis": 2 508 | } 509 | ], 510 | "spaceLength": 10, 511 | "stack": false, 512 | "steppedLine": false, 513 | "targets": [ 514 | { 515 | "alias": "WLCHealth", 516 | "groupBy": [ 517 | { 518 | "params": [ 519 | "$__interval" 520 | ], 521 | "type": "time" 522 | }, 523 | { 524 | "params": [ 525 | "linear" 526 | ], 527 | "type": "fill" 528 | } 529 | ], 530 | "measurement": "exec_dnac", 531 | "orderByTime": "ASC", 532 | "policy": "default", 533 | "refId": "A", 534 | "resultFormat": "time_series", 535 | "select": [ 536 | [ 537 | { 538 | "params": [ 539 | "WLC.score" 540 | ], 541 | "type": "field" 542 | }, 543 | { 544 | "params": [], 545 | "type": "mean" 546 | } 547 | ] 548 | ], 549 | "tags": [] 550 | }, 551 | { 552 | "alias": "Wireless Client Count", 553 | "groupBy": [ 554 | { 555 | "params": [ 556 | "$__interval" 557 | ], 558 | "type": "time" 559 | }, 560 | { 561 | "params": [ 562 | "linear" 563 | ], 564 | "type": "fill" 565 | } 566 | ], 567 | "measurement": "exec_dnac", 568 | "orderByTime": "ASC", 569 | "policy": "default", 570 | "refId": "B", 571 | "resultFormat": "time_series", 572 | "select": [ 573 | [ 574 | { 575 | "params": [ 576 | "WIRELESS-client.count" 577 | ], 578 | "type": "field" 579 | }, 580 | { 581 | "params": [], 582 | "type": "mean" 583 | } 584 | ] 585 | ], 586 | "tags": [] 587 | } 588 | ], 589 | "thresholds": [], 590 | "timeFrom": null, 591 | "timeRegions": [], 592 | "timeShift": null, 593 | "title": "WLC Health", 594 | "tooltip": { 595 | "shared": true, 596 | "sort": 0, 597 | "value_type": "individual" 598 | }, 599 | "type": "graph", 600 | "xaxis": { 601 | "buckets": null, 602 | "mode": "time", 603 | "name": null, 604 | "show": true, 605 | "values": [] 606 | }, 607 | "yaxes": [ 608 | { 609 | "format": "short", 610 | "label": null, 611 | "logBase": 1, 612 | "max": "100", 613 | "min": "0", 614 | "show": true 615 | }, 616 | { 617 | "format": "short", 618 | "label": null, 619 | "logBase": 1, 620 | "max": null, 621 | "min": null, 622 | "show": true 623 | } 624 | ], 625 | "yaxis": { 626 | "align": false, 627 | "alignLevel": null 628 | } 629 | }, 630 | { 631 | "aliasColors": {}, 632 | "bars": false, 633 | "dashLength": 10, 634 | "dashes": false, 635 | "datasource": "InfluxDB", 636 | "fill": 1, 637 | "fillGradient": 0, 638 | "gridPos": { 639 | "h": 8, 640 | "w": 12, 641 | "x": 0, 642 | "y": 16 643 | }, 644 | "id": 4, 645 | "legend": { 646 | "avg": false, 647 | "current": false, 648 | "max": false, 649 | "min": false, 650 | "show": true, 651 | "total": false, 652 | "values": false 653 | }, 654 | "lines": true, 655 | "linewidth": 1, 656 | "nullPointMode": "null", 657 | "options": { 658 | "dataLinks": [] 659 | }, 660 | "percentage": false, 661 | "pointradius": 2, 662 | "points": false, 663 | "renderer": "flot", 664 | "seriesOverrides": [], 665 | "spaceLength": 10, 666 | "stack": false, 667 | "steppedLine": false, 668 | "targets": [ 669 | { 670 | "alias": "CoreHealth", 671 | "groupBy": [ 672 | { 673 | "params": [ 674 | "$__interval" 675 | ], 676 | "type": "time" 677 | }, 678 | { 679 | "params": [ 680 | "linear" 681 | ], 682 | "type": "fill" 683 | } 684 | ], 685 | "measurement": "exec_dnac", 686 | "orderByTime": "ASC", 687 | "policy": "default", 688 | "refId": "A", 689 | "resultFormat": "time_series", 690 | "select": [ 691 | [ 692 | { 693 | "params": [ 694 | "core.score" 695 | ], 696 | "type": "field" 697 | }, 698 | { 699 | "params": [], 700 | "type": "mean" 701 | } 702 | ] 703 | ], 704 | "tags": [] 705 | } 706 | ], 707 | "thresholds": [], 708 | "timeFrom": null, 709 | "timeRegions": [], 710 | "timeShift": null, 711 | "title": "Core HealthScore", 712 | "tooltip": { 713 | "shared": true, 714 | "sort": 0, 715 | "value_type": "individual" 716 | }, 717 | "type": "graph", 718 | "xaxis": { 719 | "buckets": null, 720 | "mode": "time", 721 | "name": null, 722 | "show": true, 723 | "values": [] 724 | }, 725 | "yaxes": [ 726 | { 727 | "format": "short", 728 | "label": null, 729 | "logBase": 1, 730 | "max": null, 731 | "min": null, 732 | "show": true 733 | }, 734 | { 735 | "format": "short", 736 | "label": null, 737 | "logBase": 1, 738 | "max": null, 739 | "min": null, 740 | "show": true 741 | } 742 | ], 743 | "yaxis": { 744 | "align": false, 745 | "alignLevel": null 746 | } 747 | }, 748 | { 749 | "aliasColors": {}, 750 | "bars": false, 751 | "dashLength": 10, 752 | "dashes": false, 753 | "datasource": "InfluxDB", 754 | "fill": 1, 755 | "fillGradient": 0, 756 | "gridPos": { 757 | "h": 9, 758 | "w": 12, 759 | "x": 12, 760 | "y": 16 761 | }, 762 | "id": 2, 763 | "legend": { 764 | "avg": false, 765 | "current": false, 766 | "max": false, 767 | "min": false, 768 | "show": true, 769 | "total": false, 770 | "values": false 771 | }, 772 | "lines": true, 773 | "linewidth": 1, 774 | "nullPointMode": "null", 775 | "options": { 776 | "dataLinks": [] 777 | }, 778 | "percentage": false, 779 | "pointradius": 2, 780 | "points": false, 781 | "renderer": "flot", 782 | "seriesOverrides": [ 783 | { 784 | "alias": "TotalDevices", 785 | "yaxis": 2 786 | } 787 | ], 788 | "spaceLength": 10, 789 | "stack": false, 790 | "steppedLine": false, 791 | "targets": [ 792 | { 793 | "alias": "HealthScore", 794 | "groupBy": [ 795 | { 796 | "params": [ 797 | "$__interval" 798 | ], 799 | "type": "time" 800 | }, 801 | { 802 | "params": [ 803 | "linear" 804 | ], 805 | "type": "fill" 806 | } 807 | ], 808 | "measurement": "exec_dnac", 809 | "orderByTime": "ASC", 810 | "policy": "default", 811 | "refId": "A", 812 | "resultFormat": "time_series", 813 | "select": [ 814 | [ 815 | { 816 | "params": [ 817 | "totalscore" 818 | ], 819 | "type": "field" 820 | }, 821 | { 822 | "params": [], 823 | "type": "mean" 824 | } 825 | ] 826 | ], 827 | "tags": [] 828 | }, 829 | { 830 | "alias": "TotalDevices", 831 | "groupBy": [ 832 | { 833 | "params": [ 834 | "$__interval" 835 | ], 836 | "type": "time" 837 | }, 838 | { 839 | "params": [ 840 | "linear" 841 | ], 842 | "type": "fill" 843 | } 844 | ], 845 | "measurement": "exec_dnac", 846 | "orderByTime": "ASC", 847 | "policy": "default", 848 | "refId": "B", 849 | "resultFormat": "time_series", 850 | "select": [ 851 | [ 852 | { 853 | "params": [ 854 | "totalcount" 855 | ], 856 | "type": "field" 857 | }, 858 | { 859 | "params": [], 860 | "type": "mean" 861 | } 862 | ] 863 | ], 864 | "tags": [] 865 | } 866 | ], 867 | "thresholds": [ 868 | { 869 | "colorMode": "critical", 870 | "fill": true, 871 | "line": true, 872 | "op": "lt", 873 | "value": 80, 874 | "yaxis": "left" 875 | } 876 | ], 877 | "timeFrom": null, 878 | "timeRegions": [], 879 | "timeShift": null, 880 | "title": "Total Device health score", 881 | "tooltip": { 882 | "shared": true, 883 | "sort": 0, 884 | "value_type": "individual" 885 | }, 886 | "type": "graph", 887 | "xaxis": { 888 | "buckets": null, 889 | "mode": "time", 890 | "name": null, 891 | "show": true, 892 | "values": [] 893 | }, 894 | "yaxes": [ 895 | { 896 | "format": "short", 897 | "label": null, 898 | "logBase": 1, 899 | "max": "100", 900 | "min": "0", 901 | "show": true 902 | }, 903 | { 904 | "format": "short", 905 | "label": "", 906 | "logBase": 1, 907 | "max": "30", 908 | "min": "0", 909 | "show": true 910 | } 911 | ], 912 | "yaxis": { 913 | "align": true, 914 | "alignLevel": null 915 | } 916 | } 917 | ], 918 | "refresh": "1m", 919 | "schemaVersion": 19, 920 | "style": "dark", 921 | "tags": [], 922 | "templating": { 923 | "list": [] 924 | }, 925 | "time": { 926 | "from": "now-6h", 927 | "to": "now" 928 | }, 929 | "timepicker": { 930 | "refresh_intervals": [ 931 | "5s", 932 | "10s", 933 | "30s", 934 | "1m", 935 | "5m", 936 | "15m", 937 | "30m", 938 | "1h", 939 | "2h", 940 | "1d" 941 | ] 942 | }, 943 | "timezone": "", 944 | "title": "dnac health", 945 | "uid": "wl6iVtcWz", 946 | "version": 18 947 | } --------------------------------------------------------------------------------