diff --git a/dist/CHANGELOG.md b/dist/CHANGELOG.md new file mode 100644 index 0000000..39c942c --- /dev/null +++ b/dist/CHANGELOG.md @@ -0,0 +1,79 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +## [1.4.1] - 2020-09-25 + +### Fixed + +- 403 error when using non-admin Kentik user [#31](https://github.com/kentik/kentik-grafana-app/issues/31) + +## [1.4.0] - 2019-12-26 + +### Breaking changes + +Fixed "Permission denied" error for Viewers and Editors [#28](https://github.com/kentik/kentik-grafana-app/pull/28). + +Because of [#28](https://github.com/kentik/kentik-grafana-app/pull/28) it's required to do after update: +- restart Grafana +- go to the plugin config (e.g. http://localhost:3000/plugins/kentik-app/) and click "Update" + +## [1.3.6] - 2019-10-02 + +### New Features + +- Resolve IPs in a given view [#5](https://github.com/kentik/kentik-grafana-app/issues/5) + +## [1.3.5] - 2019-09-23 + +Autocomplete for plugin #4 + +## [1.3.4] - 2019-05-24 + +- Added support for custom api endpoints, [#71](https://github.com/grafana/kentik-app/issues/71) + + +## [1.3.3] - 2019-02-01 + +### New Features +- Added support for EU api endpoint, [#64](https://github.com/grafana/kentik-app/issues/64) + +### Fixed +- click-through to device-details page now works correctly + +### Changed +- Updated device-details page to show more data +- device-details page now displays more informative messages when updating fails + +## [1.3.2] - 2018-12-18 + +### New Features +- Added better error messaging for API issues, [#61](https://github.com/grafana/kentik-app/issues/61) + +## [1.3.1] - 2018-11-13 + +### Fixed + +- Filter operators do not match Group By operators, [#37](https://github.com/grafana/kentik-app/issues/37) + +## [1.3.0] - 2018-10-22 + +### New Features + +- Custom dimensions support [#46](https://github.com/grafana/kentik-app/issues/46) +- Direct filter import (using saved filters in Grafana) [#45](https://github.com/grafana/kentik-app/issues/45) + +## [1.2.4] - 2017-05-22 + +### New Features + +- Test for Kentik query builder + +### Changed + +- Enable stacking by default in Kentik top talkers dashboard + +### Fixed + +- Unique Src/Dst IPs metrics (after Kentik API update) +- Table data columns for Unique Src/Dst IPs metrics (now is Avg, p95th, Max, p95th mbps, p95th pps) diff --git a/dist/README.md b/dist/README.md new file mode 100644 index 0000000..5a2daba --- /dev/null +++ b/dist/README.md @@ -0,0 +1,98 @@ +[![CircleCI](https://circleci.com/gh/grafana/kentik-app.svg?style=svg)](https://circleci.com/gh/grafana/kentik-app) +[![David Dependancy Status](https://david-dm.org/grafana/kentik-app.svg)](https://david-dm.org/grafana/kentik-app) +[![David Dev Dependency Status](https://david-dm.org/grafana/kentik-app/dev-status.svg)](https://david-dm.org/grafana/kentik-app/?type=dev) + + + +Kentik Connect for Grafana allows you to quickly and easily enhance your visibility into your network traffic. Kentik Connect leverages the power of Kentik Detect, which provides real-time, Internet-scale ingest and querying of network data including flow records (NetFlow, IPFIX, sFlow), BGP, GeoIP, and SNMP. Stored in the Kentik Data Engine (KDE), Kentik Detect’s distributed post-Hadoop Big Data backend, this information is a rich source of actionable insights into network traffic, including anomalies that can affect application or service performance. Kentik Connect provides Grafana with instant access to KDE, enabling you to seamlessly integrate network activity metrics into your Grafana dashboard. + +## Features + +Kentik Connect for Grafana ships with an official Kentik Data Source, the database connector that allows you to read and visualize data directly from KDE. Within the Grafana environment, you can specify the parameters of the traffic that you want Kentik Connect to display: + +- Timespan: set the time range for which you want to see traffic data. +- Devices: view traffic from all devices or individual routers, switches, or hosts. +- Dimensions: group by over 30 source and destination dimensions representing NetFlow, BGP, or GeoIP data. +- Metrics: display data in metrics including bits, packets, or unique IPs. +- Sort: visualizations are accompanied by a sortable table showing Max, 95th percentile, and Average values. + +Kentik Connect also allows you to edit the configuration of devices (which must already be registered with Kentik Detect). And, as with any Grafana dashboard, current settings can be managed (Manage dashboard menu) and dashboards can be saved, shared, and starred. + +## External Dependencies + +- A Kentik account and API key is required to Enable the Kentik app. If you don’t have a Kentik account, [sign up for your Free Trial Now](https://portal.kentik.com/signup.html?ref=signup_2nd&utm_source=grafana&utm_medium=landingpage&utm_term=portal&utm_campaign=grafana-signup). +- To appear in the Kentik Connect device list, devices must first be registered with Kentik Detect. + +## Plugin installation + +The easiest way to install plugins is by using the `grafana-cli` tool which is bundled with Grafana. See [Using grafana-cli](#using-grafana-cli) paragraph. + +If there is no `grafana-cli` tool in your system, plugins can be installed [manually](#manual-installation). + +### Table of contents +- [Using grafana-cli](#using-grafana-cli) + - [Install plugin](#install-plugin) + - [Update plugin](#update-plugin) +- [Manual installation](#manual-installation) +- [Docker installation](#docker-installation) + +### Using grafana-cli + +Grafana docs about plugin installation: https://grafana.com/docs/plugins/installation/#installing-plugins. + +#### Install plugin +```bash +grafana-cli --pluginUrl "https://github.com/kentik/kentik-grafana-app/releases/download/v1.4.1/kentik-app-1.4.1.zip" plugins install kentik-app +sudo systemctl restart grafana-server +``` + +#### Update plugin + +```bash +grafana-cli --pluginUrl "https://github.com/kentik/kentik-grafana-app/releases/download/v1.4.1/kentik-app-1.4.1.zip" plugins update kentik-app +sudo systemctl restart grafana-server +``` + +### Manual installation + +- Navigate to Grafana plugins directory: + - For Grafana installed from `.deb`/`.rpm` package: + - `/var/lib/grafana/plugins` + - For Grafana installed using Standalone Linux Binaries or source: + - `/data/plugins` + +- Download kentik-app +```bash +wget https://github.com/kentik/kentik-grafana-app/releases/download/v1.4.1/kentik-app-1.4.1.tar.gz +``` + +- Remove old kentik-app (if it exists) +```bash +rm -rf kentik-app +``` + +- Unpack downloaded files +```bash +tar -zxvf kentik-app-1.4.1.tar.gz +``` + +- Restart Grafana + - For Grafana installed from `.deb`/`.rpm` package: + - `systemctl restart grafana-server` + - For Grafana installed using Standalone Linux Binaries or source: + - Stop any running instances of grafana-server + - Start grafana-server: `cd && ./bin/grafana-server` + +### Docker installation + +You can install Kentik App to Grafana in Docker passing it as the environment variable. + +```bash +docker run \ + -p 3000:3000 \ + -e "GF_INSTALL_PLUGINS=https://github.com/kentik/kentik-grafana-app/releases/download/v1.4.1/kentik-app-1.4.1.zip;kentik-grafana-app" \ + grafana/grafana +``` + +#### Useful links +- Grafana docs about Docker installation: https://docs.grafana.org/installation/docker/#installing-plugins-from-other-sources diff --git a/dist/components/add_device.html b/dist/components/add_device.html new file mode 100644 index 0000000..72b3aca --- /dev/null +++ b/dist/components/add_device.html @@ -0,0 +1,95 @@ + +
+
+

Devices in Kentik are sources of network flow data - commonly a network component such as a switch or router, or + a flow generation agent on a host/server. Once configured, Kentik will automatically begin tracking and returning + direct insights from that source viewpoint into exactly which applications and endpoints are actively driving + network traffic.

+
+
+ +
+
+
+ + +
+
+ +
+ +
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+
+
+ +
+ +
+
+
+ + Cancel +
diff --git a/dist/components/device_details.html b/dist/components/device_details.html new file mode 100644 index 0000000..f79ea13 --- /dev/null +++ b/dist/components/device_details.html @@ -0,0 +1,245 @@ + + +
+ + +
+
+
+
+

Update device details

+
+
+
+ + +
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+ +
+
+
+ +
+ +
+
+
+ + +
+
+ + + + +
+
+
+
+ +
+ +
+
+
+ + +
+
+ + +
+
+
+
+ +
+ +
+
+
+
+ + Cancel +
+
+ +
+
+

Router Configuration Overview

+

Setting up a device to use with Kentik Detect involves configuration steps on the device itself and also on + the Devices » Add Device page in the Kentik Detect portal. Before you start, you'll need to know whether you'll + be exporting flow to the Kentik Detect servers directly or through a local encryptor/redirector running the + Kentik software called "chfagent" (see NetFlow Proxy Agent).

+ +

The device configuration process varies depending on device manufacturer, but is typically performed in + "configuration mode" or in a "configuration editor." Before you start you'll need to know the following + information: +

    +
  • The destination IP and Port for the router to send flow too (flow collector IP). Depending on your + configuration, this will be either the Kentik Detect servers (see the device tab for "flow collector IP" + and "flow collector port") or will be the IP and Port you chose on your local encryptor/redirector running + chfagent.
  • +
  • The sample rate (see Flow Sampling).
  • +
  • Whether you will examine ingress or egress (ingress is recommended; see Ingress and Egress).
  • +
+

+

The following sections cover several configurations that work on some hardware/software combinations.

+ + Notes: +

- Routers must be configured to persist SNMP interface IDs across reboots. The example configurations below + include, where applicable, the commands to accomplish this.

+

- Every vendor changes flow configuration slightly based on hardware and software versions. The configuration + information below is provided for reference only. Check your router vendor documentation before configuring + your devices for use with Kentik Detect.

+ +

SNMP OID Polling

+

OIDs are identifiers for SNMP objects that each represent the properties of a network-connected device such as + a router. An OID takes the form of a path to the SNMP object it represents. Like a standard HTTP path, each + segment represents a successively narrower slice of the entire networked universe, but in the case of an OID + each segment is a pre-assigned number. The base OID for MIB-2 defined SNMP variables is 1.3.6.1.2.1.

+ +

Kentik Detect polls 11 SNMP OIDs in two different categories: +

    +
  • Selected counter OIDs: polled every two minutes; stored for SNMP-related querying, e.g. + comparison to flow (see Compare Flow with SNMP).
  • +
  • Selected info OIDs: polled every 30 minutes for interface information.
  • +
+

+

To enable Kentik Detect to properly poll SNMP on a given router: +

    +
  • Ensure that SNMP is enabled for the router.
  • +
  • Permit SNMP polling of the router from the IPs listed in the Device SNMP Polling IPs field of the Device + Details page in the portal.
  • +
  • Set community on the router to match the SNMP Community string indicated on the Device Details page for + the router.
  • +
  • If the router has been configured to block polling of any of the specific OIDs polled by Kentik Detect, + re-enable polling of those OIDs.
  • +
+

+

If you've successfully completed the steps above, after about 30 minutes (one complete polling interval) + you'll be able to verify in the portal that Kentik Detect is able to poll your router: +

    +
  • Go to the portal's Devices page (choose Devices from the drop-down Admin menu).
  • +
  • In the Device list, confirm that the SNMP indicator in the column at left is green.
  • +
  • Click the Interfaces button for the router, which takes you to that router's Interfaces page.
  • +
  • Verify that names and descriptions for the router's interfaces appear on the Interfaces page.
  • +
  • Verify that blue bars for SNMP ingress and egress are present in the left-hand columns of the Interfaces + list.
  • +
  • Click the Traffic button to go to the Data Explorer, where you'll see a graph comparing SNMP and flow + rates for the router over the preceding hour.
  • +
+

+
+
+ + + + + + + + + + +
diff --git a/dist/components/device_list.html b/dist/components/device_list.html new file mode 100644 index 0000000..0e889cd --- /dev/null +++ b/dist/components/device_list.html @@ -0,0 +1,68 @@ + + +
+
+ +

To infinity...and beyond.

+

This is taking longer than expected.

+

We apologize, something may be up. Please try refreshing first, and contact us if + this continues to happen.

+
+
+ +
+
+
+ +

Looks like you don’t have any devices yet.
+ Add a new device +

+
+ + What's a device? + + What's a device? + + +
+
+

Devices in Kentik are sources of network flow data - commonly a network + component such as a switch or router, or a flow generation agent on a host/server.

+

Once configured, Kentik will automatically begin tracking and returning direct + insights from that source viewpoint into exactly which applications and endpoints are actively driving + network traffic.

+
+
+
+
+ +
+
    +
  1. + +
  2. +
+
diff --git a/dist/dashboards/kentik-home.json b/dist/dashboards/kentik-home.json new file mode 100644 index 0000000..62749b9 --- /dev/null +++ b/dist/dashboards/kentik-home.json @@ -0,0 +1,128 @@ +{ + "id": null, + "title": "Kentik: Home", + "originalTitle": "Kentik: Home", + "tags": ["kentik"], + "style": "dark", + "timezone": "browser", + "editable": false, + "hideControls": true, + "sharedCrosshair": false, + "rows": [ + { + "collapse": false, + "editable": true, + "height": "330px", + "panels": [ + { + "editable": true, + "error": false, + "id": 5, + "span": 7.5, + "height": "415px", + "title": "", + "type": "kentik-device-list" + }, + { + "content": "", + "editable": true, + "error": false, + "id": 4, + "links": [], + "mode": "markdown", + "span": 0.5, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }, + { + "editable": true, + "error": false, + "id": 1, + "span": 4, + "title": "", + "type": "kentik-call-to-action" + }, + { + "content": "", + "editable": true, + "error": false, + "id": 6, + "links": [], + "mode": "markdown", + "span": 0.5, + "style": {}, + "title": "", + "transparent": true, + "type": "text" + }, + { + "editable": true, + "error": false, + "id": 3, + "limit": 10, + "links": [], + "mode": "search", + "query": "", + "span": 4, + "tags": [ + "kentik" + ], + "title": "Kentik dashboards", + "type": "dashlist" + } + ], + "title": "Row" + }, + { + "collapse": false, + "editable": true, + "height": "250px", + "panels": [], + "title": "Endpoint List Row" + } + ], + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "collapse": false, + "enable": true, + "notice": false, + "now": true, + "refresh_intervals": [ + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "status": "Stable", + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ], + "type": "timepicker" + }, + "templating": { + "list": [] + }, + "annotations": { + "list": [] + }, + "schemaVersion": 7, + "version": 3, + "revision": 2, + "links": [] + } diff --git a/dist/dashboards/kentik-top-talkers.json b/dist/dashboards/kentik-top-talkers.json new file mode 100644 index 0000000..3ee9811 --- /dev/null +++ b/dist/dashboards/kentik-top-talkers.json @@ -0,0 +1,278 @@ +{ + "title": "Kentik Top Talkers", + "originalTitle": "Kentik Top Talkers", + "tags": ["kentik"], + "style": "dark", + "timezone": "", + "editable": true, + "hideControls": false, + "sharedCrosshair": false, + "rows": [ + { + "collapse": false, + "editable": true, + "height": 534.4375, + "panels": [ + { + "aliasColors": {}, + "bars": false, + "datasource": "kentik", + "editable": true, + "error": false, + "fill": 1, + "grid": { + "threshold1": null, + "threshold1Color": "rgba(216, 200, 27, 0.27)", + "threshold2": null, + "threshold2Color": "rgba(234, 112, 112, 0.22)" + }, + "id": 1, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sort": "avg", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "span": 12, + "stack": true, + "steppedLine": false, + "targets": [ + { + "device": "$device", + "metric": "$metric", + "mode": "graph", + "refId": "A", + "target": "", + "unit": "$unit", + "hostnameLookup": "$dns_lookup" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Kentik Network Flow Data", + "tooltip": { + "msResolution": false, + "shared": true, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "show": true + }, + "yaxes": [ + { + "format": "bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ] + } + ], + "title": "Row" + }, + { + "collapse": false, + "editable": true, + "height": 495.015625, + "panels": [ + { + "columns": [], + "datasource": "kentik", + "editable": true, + "error": false, + "fontSize": "100%", + "id": 2, + "isNew": true, + "links": [], + "pageSize": null, + "scroll": true, + "showHeader": true, + "sort": { + "col": 1, + "desc": true + }, + "span": 12, + "styles": [ + { + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "/^(Max|95th|p95th|Avg|Average)/", + "thresholds": [], + "type": "number", + "unit": "short" + } + ], + "targets": [ + { + "device": "$device", + "metric": "$metric", + "mode": "table", + "refId": "A", + "target": "", + "unit": "$unit", + "hostnameLookup": "$dns_lookup" + } + ], + "title": "", + "transform": "table", + "type": "table" + } + ], + "title": "New row" + } + ], + "time": { + "from": "now-30m", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "templating": { + "list": [ + { + "allValue": null, + "current": { + "tags": [], + "text": "disabled", + "value": "disabled" + }, + "hide": 0, + "includeAll": false, + "label": "DNS Lookup", + "multi": false, + "name": "dns_lookup", + "options": [ + { + "selected": false, + "text": "enabled", + "value": "enabled" + }, + { + "selected": true, + "text": "disabled", + "value": "disabled" + } + ], + "query": "enabled,disabled", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "tags": [], + "text": "All", + "value": [ + "$__all" + ] + }, + "datasource": "kentik", + "hide": 0, + "includeAll": true, + "label": "Devices", + "multi": true, + "name": "device", + "options": [], + "query": "devices()", + "refresh": 1, + "type": "query" + }, + { + "current": {"value": "Traffic", "text": "Traffic"}, + "datasource": "kentik", + "hide": 0, + "includeAll": false, + "label": "Group By", + "multi": false, + "name": "metric", + "options": [], + "query": "metrics()", + "refresh": 1, + "type": "query" + }, + { + "current": {}, + "datasource": "kentik", + "hide": 0, + "includeAll": false, + "label": "Metric", + "multi": false, + "name": "unit", + "options": [], + "query": "units()", + "refresh": 1, + "regex": "", + "type": "query" + }, + { + + "datasource": "kentik", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "type": "adhoc" + } + ] + }, + "annotations": { + "list": [] + }, + "refresh": false, + "schemaVersion": 12, + "revision": 4, + "links": [] +} diff --git a/dist/datasource/config.html b/dist/datasource/config.html new file mode 100644 index 0000000..e69de29 diff --git a/dist/datasource/module.js b/dist/datasource/module.js new file mode 100644 index 0000000..8c7aa38 --- /dev/null +++ b/dist/datasource/module.js @@ -0,0 +1 @@ +define(["lodash","angular","app/core/core","app/plugins/sdk","moment","app/core/table_model"],(function(t,e,n,r,i,o){return function(t){var e={};function n(r){if(e[r])return e[r].exports;var i=e[r]={i:r,l:!1,exports:{}};return t[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}return n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:r})},n.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},n.t=function(t,e){if(1&e&&(t=n(t)),8&e)return t;if(4&e&&"object"==typeof t&&t&&t.__esModule)return t;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:t}),2&e&&"string"!=typeof t)for(var i in t)n.d(r,i,function(e){return t[e]}.bind(null,i));return r},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=11)}([function(e,n){e.exports=t},function(t,e,n){"use strict";n.d(e,"a",(function(){return o})),n.d(e,"b",(function(){return s}));var r=n(3),i=n(0);function o(t){var e="";e+=t.status?"("+t.status+") ":"",e+=t.statusText?t.statusText+": ":"",t.data&&t.data.error?e+=t.data.error:t.err?e+=t.err:i.isString(t)&&(e+=t),r.appEvents.emit("alert-error",["Can't connect to Kentik API",e])}function s(t,e,n){var o="";o+=e.status?"("+e.status+") ":"",o+=e.statusText?e.statusText+": ":"",e.data&&e.data.error?o+=e.data.error:e.err?o+=e.err:i.isString(e)&&(o+=e),r.appEvents.emit("alert-"+n,[t,o])}},function(t,n){t.exports=e},function(t,e){t.exports=n},function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n(1),i=n(2),o=n.n(i),s=function(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function a(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){t.done?i(t.value):new n((function(e){e(t.value)})).then(s,a)}u((r=r.apply(t,e||[])).next())}))},a=function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]s.duration(1,"months")?36e5:e>s.duration(1,"day")?9e5:3e5}(e);return!this.cache[n]||r-o>p||this.cache[n]&&(r-d>p||i6e4)},t.prototype.getFieldValues=function(t){return a(this,void 0,void 0,(function(){var e,n;return u(this,(function(r){switch(r.label){case 0:return e=c(),this.cache[t]&&e-this.cache[t].ts"),{filterField:e.field,operator:t.operator,filterValue:t.value}}var m,g={buildTopXdataQuery:function(t){var e,n,r=o.find(p,{value:t.unit}),i=t.range.from.utc().format("YYYY-MM-DD HH:mm:ss"),s=t.range.to.utc().format("YYYY-MM-DD HH:mm:ss");return{dimension:[t.metric],metric:t.unit,matrixBy:[],cidr:32,cidr6:128,topx:"8",depth:100,fastData:"Auto",lookback_seconds:0,time_format:"UTC",starting_time:i,ending_time:s,device_name:t.deviceNames,outsort:r.outsort,aggregates:v(r),filters_obj:(e=t.kentikFilterGroups,n={connector:"All",filterGroups:[]},e.length&&(n.filterGroups=e),n),saved_filters:t.kentikSavedFilters,hostname_lookup:t.hostnameLookup}},formatAggs:v,convertToKentikFilterGroup:function(t,e,n){var r,i=[],s=[];if(t.length){for(var a=o.concat(h,e),u=0,c=t;u0){var p="All";!t[0].condition||"or"!==t[0].condition.toLowerCase()&&"any"!==t[0].condition.toLowerCase()||(p="Any"),i=[{connector:p,filters:i,not:!1}]}}return{kentikFilters:i,savedFilters:s}}},x=n(8),b=n.n(x),S=function(t,e,n,r){return new(n||(n=Promise))((function(i,o){function s(t){try{u(r.next(t))}catch(t){o(t)}}function a(t){try{u(r.throw(t))}catch(t){o(t)}}function u(t){t.done?i(t.value):new n((function(e){e(t.value)})).then(s,a)}u((r=r.apply(t,e||[])).next())}))},y=function(t,e){var n,r,i,o,s={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function a(o){return function(a){return function(o){if(n)throw new TypeError("Generator is already executing.");for(;s;)try{if(n=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return s.label++,{value:o[1],done:!1};case 5:s.label++,r=o[1],o=[0];continue;case 7:o=s.ops.pop(),s.trys.pop();continue;default:if(!(i=s.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]0&&i[i.length-1])||6!==o[0]&&2!==o[0])){s=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1] +
+
+ + +
+
+ + +
+
+
+
+
+
+
+ + +
+
+ +
+ +
+
+
+
+
+
+
+
+ + +
+
+
+
+
+ diff --git a/dist/img/kentik-connect-device-details.png b/dist/img/kentik-connect-device-details.png new file mode 100644 index 0000000..f3411fc Binary files /dev/null and b/dist/img/kentik-connect-device-details.png differ diff --git a/dist/img/kentik-connect-home.png b/dist/img/kentik-connect-home.png new file mode 100644 index 0000000..45664f3 Binary files /dev/null and b/dist/img/kentik-connect-home.png differ diff --git a/dist/img/kentik-connect-top-talkers-2.png b/dist/img/kentik-connect-top-talkers-2.png new file mode 100644 index 0000000..3c216c5 Binary files /dev/null and b/dist/img/kentik-connect-top-talkers-2.png differ diff --git a/dist/img/kentik-connect-top-talkers.png b/dist/img/kentik-connect-top-talkers.png new file mode 100644 index 0000000..ea7ba87 Binary files /dev/null and b/dist/img/kentik-connect-top-talkers.png differ diff --git a/dist/img/kentik_logo.png b/dist/img/kentik_logo.png new file mode 100644 index 0000000..cfda8dc Binary files /dev/null and b/dist/img/kentik_logo.png differ diff --git a/dist/img/loading-pulse.svg b/dist/img/loading-pulse.svg new file mode 100644 index 0000000..4e4ebd3 --- /dev/null +++ b/dist/img/loading-pulse.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dist/img/logo_large.png b/dist/img/logo_large.png new file mode 100644 index 0000000..a170215 Binary files /dev/null and b/dist/img/logo_large.png differ diff --git a/dist/img/logo_small.png b/dist/img/logo_small.png new file mode 100644 index 0000000..996ed36 Binary files /dev/null and b/dist/img/logo_small.png differ diff --git a/dist/module.js b/dist/module.js new file mode 100644 index 0000000..82177e5 --- /dev/null +++ b/dist/module.js @@ -0,0 +1 @@ +define(["lodash","angular","app/core/core","app/plugins/sdk"],(function(e,t,n,i){return function(e){var t={};function n(i){if(t[i])return t[i].exports;var r=t[i]={i:i,l:!1,exports:{}};return e[i].call(r.exports,r,r.exports,n),r.l=!0,r.exports}return n.m=e,n.c=t,n.d=function(e,t,i){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:i})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var r in e)n.d(i,r,function(t){return e[t]}.bind(null,r));return i},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=12)}([function(t,n){t.exports=e},function(e,t,n){"use strict";n.d(t,"a",(function(){return a})),n.d(t,"b",(function(){return o}));var i=n(3),r=n(0);function a(e){var t="";t+=e.status?"("+e.status+") ":"",t+=e.statusText?e.statusText+": ":"",e.data&&e.data.error?t+=e.data.error:e.err?t+=e.err:r.isString(e)&&(t+=e),i.appEvents.emit("alert-error",["Can't connect to Kentik API",t])}function o(e,t,n){var a="";a+=t.status?"("+t.status+") ":"",a+=t.statusText?t.statusText+": ":"",t.data&&t.data.error?a+=t.data.error:t.err?a+=t.err:r.isString(t)&&(a+=t),i.appEvents.emit("alert-"+n,[e,a])}},function(e,n){e.exports=t},function(e,t){e.exports=n},function(e,t,n){"use strict";n.d(t,"a",(function(){return c}));var i=n(1),r=n(2),a=n.n(r),o=function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function s(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){e.done?r(e.value):new n((function(t){t(e.value)})).then(o,s)}c((i=i.apply(e,t||[])).next())}))},s=function(e,t){var n,i,r,a,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,i&&(r=2&a[0]?i.return:a[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,a[1])).done)return r;switch(i=0,r&&(a=[2&a[0],r.value]),a[0]){case 0:case 1:r=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,i=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(r=o.trys,(r=r.length>0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]Enter your Kentik Credentials\n
\n
\n \n Invalid API credentials. This app wont work until the credentials are updated.\n \n
\n
\n \n \x3c!-- Hidden input to stop chrome from autofilling --\x3e\n \n \n
\n\n
\n \n
\n \n
\n
\n\n \x3c!-- custom endpoint should display the url --\x3e\n
\n \n
\n \n
\n
\n\n
\n
\n \n \x3c!-- Hidden input to stop chrome from autofilling --\x3e\n \n \n
\n \n
\n \n
\n
\n
\n
\n reset\n
\n
\n
\n\n
\n \n Successfully enabled.\n Next up: \n Go to Kentik Home Dashboard\n
\n\n
\n \n The specified Kentik user seems to have Member access level (not Admin),\n Custom Dimensions in the dashboard filters won\'t be available.\n
\n'},,,,,function(e,t,n){"use strict";n.r(t);n(13),n(18);var i,r=n(7),a=n.n(r),o=n(4),s=n(1),c=n(0),u=function(e,t,n,i){return new(n||(n=Promise))((function(r,a){function o(e){try{c(i.next(e))}catch(e){a(e)}}function s(e){try{c(i.throw(e))}catch(e){a(e)}}function c(e){e.done?r(e.value):new n((function(t){t(e.value)})).then(o,s)}c((i=i.apply(e,t||[])).next())}))},l=function(e,t){var n,i,r,a,o={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return a={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(a[Symbol.iterator]=function(){return this}),a;function s(a){return function(s){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;o;)try{if(n=1,i&&(r=2&a[0]?i.return:a[0]?i.throw||((r=i.return)&&r.call(i),0):i.next)&&!(r=r.call(i,a[1])).done)return r;switch(i=0,r&&(a=[2&a[0],r.value]),a[0]){case 0:case 1:r=a;break;case 4:return o.label++,{value:a[1],done:!1};case 5:o.label++,i=a[1],a=[0];continue;case 7:a=o.ops.pop(),o.trys.pop();continue;default:if(!(r=o.trys,(r=r.length>0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]0&&r[r.length-1])||6!==a[0]&&2!==a[0])){o=0;continue}if(3===a[0]&&(!r||a[1]>r[0]&&a[1]