{ "version": 3, "sources": ["../ui/app/components/mn_store_service.js", "../ui/app/mn_admin/mn_statistics_service.js"], "sourcesContent": ["/*\nCopyright 2019-Present Couchbase, Inc.\n\nUse of this software is governed by the Business Source License included in\nthe file licenses/BSL-Couchbase.txt. As of the Change Date specified in that\nfile, in accordance with the Business Source License, use of this software will\nbe governed by the Apache License, Version 2.0, included in the file\nlicenses/APL2.txt.\n*/\n\nimport angular from 'angular';\nimport mnHelper from './mn_helper.js';\n\nexport default 'mnStoreService';\n\nangular\n .module('mnStoreService', [mnHelper])\n .factory('mnStoreService', [\"mnHelper\", mnStoreServiceFactory]);\n\nfunction mnStoreServiceFactory(mnHelper) {\n var db = {};\n var stores = {};\n var storeService = {\n createStore: createStore,\n store: store\n };\n\n Store.prototype.get = get;\n Store.prototype.add = add;\n Store.prototype.put = put;\n Store.prototype.delete = _delete;\n Store.prototype.deleteItem = deleteItem;\n Store.prototype.getByIncludes = getByIncludes;\n Store.prototype.share = share;\n Store.prototype.copy = copy;\n Store.prototype.last = last;\n Store.prototype.clear = clear;\n\n return storeService;\n\n function store(name) {\n return stores[name];\n }\n\n function createStore(name, options) {\n stores[name] = new Store(name, options);\n }\n\n function Store(name, options) {\n this.keyPath = options.keyPath;\n this.name = name;\n if (options.fill) {\n if (db[this.name]) {\n this.clear();\n Array.prototype.push.apply(db[this.name], options.fill);\n } else {\n db[this.name] = options.fill;\n }\n } else {\n db[this.name] = [];\n }\n }\n\n function last() {\n return db[this.name][db[this.name].length - 1];\n }\n\n function clear() {\n db[this.name].splice(0, db[this.name].length);\n }\n\n function share() {\n return db[this.name];\n }\n\n function copy() {\n return db[this.name].slice();\n }\n\n function put(item) {\n var copyTo = this.get(item[this.keyPath]);\n Object.keys(item).forEach(function (key) {\n copyTo[key] = item[key];\n });\n }\n\n function add(item) {\n item = Object.assign({}, item);\n item[this.keyPath] = mnHelper.generateID();\n db[this.name].push(item);\n return item;\n }\n\n function _delete(value) {\n db[this.name].splice(db[this.name].findIndex(function (item) {\n return item[this.keyPath] == value;\n }.bind(this)), 1);\n }\n\n function deleteItem(item) {\n db[this.name].splice(db[this.name].indexOf(item), 1);\n }\n\n function get(value) {\n return db[this.name].find(function (item) {\n return item[this.keyPath] == value;\n }.bind(this));\n }\n\n function getByIncludes(value, row) {\n return db[this.name].find(function (item) {\n return item[row].includes(value);\n }.bind(this));\n }\n}\n", "/*\nCopyright 2020-Present Couchbase, Inc.\n\nUse of this software is governed by the Business Source License included in\nthe file licenses/BSL-Couchbase.txt. As of the Change Date specified in that\nfile, in accordance with the Business Source License, use of this software will\nbe governed by the Apache License, Version 2.0, included in the file\nlicenses/APL2.txt.\n*/\n\nimport angular from \"angular\";\nimport _ from \"lodash\";\nimport {timeFormat} from \"d3-time-format\";\nimport {timeMinute,\n timeHour,\n timeDay,\n timeMonth,\n timeYear} from \"d3-time\";\n\nimport mnPoll from \"../components/mn_poll.js\";\nimport mnStoreService from \"../components/mn_store_service.js\";\nimport mnPoolDefault from \"../components/mn_pool_default.js\";\nimport mnPermissions from \"../components/mn_pool_default.js\";\n\nimport mnServersService from \"./mn_servers_service.js\"\nimport mnStatisticsDescriptionService from \"./mn_statistics_description_service.js\";\nimport mnStatisticsDescription from \"./mn_statistics_description.js\";\n\nexport default \"mnStatisticsNewService\";\n\nangular\n .module('mnStatisticsNewService', [\n mnServersService,\n mnPoll,\n mnStatisticsDescriptionService,\n mnStoreService,\n mnPoolDefault,\n mnPermissions\n ])\n .factory('mnStatisticsNewService', [\"$http\", \"mnServersService\", \"mnPoller\", \"$rootScope\", \"mnStatisticsDescriptionService\", \"mnStoreService\", \"mnPoolDefault\", \"mnPermissions\", mnStatisticsNewServiceFactory]);\n\nfunction mnStatisticsNewServiceFactory($http, mnServersService, mnPoller, $rootScope, mnStatisticsDescriptionService, mnStoreService, mnPoolDefault, mnPermissions) {\n var rootScope = $rootScope.$new();\n\n var formatSecond = timeFormat(\"%-I:%M:%S%p\");\n var formatMinute = timeFormat(\"%-I:%M%p\");\n var formatHour = timeFormat(\"%-I%p\");\n var formatDayMonth = timeFormat(\"%b %-d\");\n var formatYear = timeFormat(\"%Y\");\n\n var mnStatisticsNewService = {\n prepareNodesList: prepareNodesList,\n export: {\n scenario: {}\n },\n descriptionPathsToStatNames: descriptionPathsToStatNames,\n descriptionPathToStatName: descriptionPathToStatName,\n defaultZoomInterval: defaultZoomInterval,\n\n copyScenario: copyScenario,\n deleteScenario: deleteScenario,\n deleteGroup: deleteGroup,\n deleteChart: deleteChart,\n doAddPresetScenario: doAddPresetScenario,\n\n getStatsDirectory: getStatsDirectory,\n get70StatUniqueName: get70StatUniqueName,\n readByPath: readByPath,\n getStatsUnits: getStatsUnits,\n getStatsTitle: getStatsTitle,\n getStatsDesc: getStatsDesc,\n buildChartConfig: buildChartConfig,\n tickMultiFormat: multiFormat,\n packStatsConfig: packStatsConfig,\n postStatsRange: postStatsRange,\n postStats: postStats,\n createStatsPoller: createStatsPoller,\n mnAdminStatsPoller: createStatsPoller(rootScope),\n getChartStep: function (zoom) {\n if (mnPoolDefault.export.compat.atLeast70) {\n return rangeZoomToStep(zoom) * 1000;\n } else {\n return zoomToStep(zoom) * 1000;\n }\n },\n getChartStart: function (zoom) {\n if (mnPoolDefault.export.compat.atLeast70) {\n return rangeZoomToSec(zoom) * 1000;\n } else {\n return zoomToMS(zoom);\n }\n }\n };\n\n return mnStatisticsNewService;\n\n function switchToFullStatInfo(config, originConfig) {\n config.step = rangeZoomToStep(originConfig.zoom);\n config.timeWindow = Math.max(config.step * 2, 360);\n config.start = 0 - rangeZoomToSec(originConfig.zoom);\n if (originConfig.zoom == \"minute\") {\n //in order to make sure that we recieve 12 samples UI\n //should send a bit less seconds\n //e.g. start = - N * step + 1 (- 12 * 10 + 1 = -119)\n config.start += 1;\n }\n }\n\n function switchToSingleStat(config, originConfig) {\n let step = rangeZoomToStep(originConfig.zoom);\n config.start = -step;\n config.step = step;\n config.timeWindow = Math.max(step * 2, 360);\n }\n\n function createStatsPoller(scope) {\n var perChartConfig = [];\n var perChartStatsPath = [];\n var perChartScopes = [];\n var perChartOriginConfig = [];\n var currentPerChartScopes = [];\n var counter = 0;\n let heartbeat =\n new mnPoller(scope, function () {\n counter++;\n currentPerChartScopes = [...perChartScopes];\n return mnPoolDefault.export.compat.atLeast70 ?\n postStatsRange([...perChartConfig]) :\n postStats([...perChartConfig]);\n })\n .setInterval(function (resp) {\n return (resp && resp.interval) || 10000;\n })\n .subscribe(function (value) {\n if (!value.data) {\n return;\n }\n if (mnPoolDefault.export.compat.atLeast70) {\n currentPerChartScopes.forEach(scope => delete scope[\"mnUIStats\"]);\n currentPerChartScopes.forEach(unpack70Stats(value));\n } else {\n currentPerChartScopes.forEach(function (scope, i) {\n scope[\"mnUIStats\"] = value.data[i];\n });\n }\n })\n .onResum(function () {\n counter = 0;\n if (mnPoolDefault.export.compat.atLeast70) {\n perChartConfig.forEach(function (config, i) {\n switchToFullStatInfo(config, perChartOriginConfig[i]);\n });\n }\n });\n\n return {\n subscribeUIStatsPoller: subscribeUIStatsPoller,\n heartbeat: heartbeat,\n isThisInitCall: () => counter == 1\n };\n\n function subscribeUIStatsPoller(config, scope) {\n if (!mnPermissions.export.cluster.collection['.:.:.'].stats.read) {\n return;\n }\n let config1 = packStatsConfig(config);\n\n function register(config2, statPath) {\n if (mnPoolDefault.export.compat.atLeast70) {\n perChartStatsPath.push(statPath);\n delete config2.statPath;\n }\n\n perChartOriginConfig.push(config);\n perChartConfig.push(config2);\n perChartScopes.push(scope);\n\n heartbeat.throttledReload();\n }\n function omit(config2) {\n var index = perChartConfig.indexOf(config2);\n perChartConfig.splice(index, 1);\n perChartScopes.splice(perChartScopes.indexOf(scope), 1);\n perChartOriginConfig.splice(perChartScopes.indexOf(config), 1);\n\n if (mnPoolDefault.export.compat.atLeast70) {\n perChartStatsPath.splice(index, 1);\n }\n\n if (!perChartConfig.length) {\n heartbeat.stop();\n }\n }\n config1.forEach((config2) => {\n let statPath = config2.statPath;\n register(config2, statPath);\n scope.$on(\"$destroy\", function () {\n omit(config2);\n });\n });\n }\n\n function unpack70Stats(resp) {\n return function (scope, i) {\n if (!resp.data[i]) {\n return;\n }\n var config = perChartConfig[i];\n if (!config) {\n return;\n }\n switchToSingleStat(config, perChartOriginConfig[i]);\n var statPath = perChartStatsPath[i];\n var data = resp.data[i].data[0];\n scope[\"mnUIStats\"] = scope[\"mnUIStats\"] || {\n stats: {},\n endTimestamp: resp.data[i].endTimestamp * 1000,\n startTimestamp: resp.data[i].startTimestamp * 1000\n };\n var maybeScopeHasStat = scope[\"mnUIStats\"].stats[statPath] || {};\n if (!config.nodesAggregation) {\n scope[\"mnUIStats\"].stats[statPath] =\n resp.data[i].data.reduce((acc, data) => {\n acc[data.metric.nodes[0]] = data;\n return acc;\n }, maybeScopeHasStat);\n } else {\n scope[\"mnUIStats\"].stats[statPath] =\n maybeScopeHasStat;\n maybeScopeHasStat[config.nodesAggregation ? \"aggregate\" : data.nodes[0]] = data;\n }\n }\n }\n }\n\n function buildChartConfig(stats, statName, currentNode, title, unit, axis, previousData, isThisInitCall, start, step) {\n currentNode = currentNode == \"all\" ? \"aggregate\" : currentNode;\n var perNodeStats = stats.stats[statName] && stats.stats[statName][currentNode];\n var values = [];\n\n if (perNodeStats) {\n if (mnPoolDefault.export.compat.atLeast70) {\n if (previousData && !isThisInitCall) {\n perNodeStats.values = [perNodeStats.values.pop()];\n values = previousData.values;\n }\n\n perNodeStats.values.forEach(([ts, v]) => {\n values.push([ts * 1000, Number(v)]);\n });\n\n if (!isThisInitCall && (values.length > start/step)) {\n values = values.slice(values.length - start/step);\n previousData && (previousData.values = values);\n }\n } else {\n stats.timestamps.forEach((ts, i) => {\n var v = perNodeStats[i];\n var convertValue = v === null ? undefined : v;\n values.push([ts, convertValue]);\n });\n }\n }\n\n let yMin = 0;\n let yMax = 1;\n values.forEach(v => {\n yMin = yMin > v[1] ? v[1] : yMin;\n yMax = yMax < v[1] ? v[1] : yMax;\n });\n\n return {\n endTimestamp: stats.endTimestamp,\n startTimestamp: previousData && !isThisInitCall ? previousData.startTimestamp + step : stats.startTimestamp,\n type: 'line',\n unit: unit,\n yAxis: axis,\n yMin: yMin,\n yMax: yMax,\n key: title,\n values: values\n };\n }\n\n function defaultZoomInterval(zoom) {\n return mnPoolDefault.export.compat.atLeast70 ? function () {\n return rangeZoomToStep(zoom) * 1000;\n } : function (resp) {\n return resp.interval || (function () {\n switch (zoom) {\n case \"minute\": return 1000;\n default: return 15000;\n }\n })();\n }\n }\n\n // Define filter conditions\n function multiFormat(date) {\n return (timeMinute(date) < date ? formatSecond\n : timeHour(date) < date ? formatMinute\n : timeDay(date) < date ? formatHour\n : timeMonth(date) < date ? formatDayMonth\n : timeYear(date) < date ? formatDayMonth\n : formatYear)(date);\n }\n\n function getStatsDirectory(bucket, params) {\n //we are using this end point in new stats ui in order to tie ddocs names with ddocs stats\n //via ddocs signatures\n params = params || {\n adde: '\"all\"',\n adda: '\"all\"',\n addi: '\"all\"',\n addf: '\"all\"',\n addq: \"1\"\n };\n return $http({\n url: \"/pools/default/buckets/\" + bucket + \"/statsDirectory\",\n method: 'GET',\n params: params\n });\n }\n\n function deleteChart(chartID) {\n var group = mnStoreService.store(\"groups\").getByIncludes(chartID, \"charts\");\n group.charts.splice(group.charts.indexOf(chartID), 1);\n mnStoreService.store(\"charts\").delete(chartID);\n }\n\n function deleteGroup(groupID) {\n var scenario = mnStoreService.store(\"scenarios\").getByIncludes(groupID, \"groups\");\n scenario.groups.splice(scenario.groups.indexOf(groupID), 1);\n var group = mnStoreService.store(\"groups\").get(groupID);\n group.charts.forEach(function (chartID) {\n mnStoreService.store(\"charts\").delete(chartID);\n });\n mnStoreService.store(\"groups\").delete(groupID);\n }\n\n function deleteScenario(scenarioID) {\n var scenario = mnStoreService.store(\"scenarios\").get(scenarioID);\n mnStoreService.store(\"scenarios\").deleteItem(scenario);\n scenario.groups.forEach(function (groupID) {\n var group = mnStoreService.store(\"groups\").get(groupID);\n mnStoreService.store(\"groups\").deleteItem(group);\n group.charts.forEach(function (chartID) {\n mnStoreService.store(\"charts\").delete(chartID);\n });\n });\n }\n\n function copyScenario(scenario, copyFrom) {\n scenario = mnStoreService.store(\"scenarios\").add(scenario);\n scenario.groups = (copyFrom.groups || []).map(function (groupID) {\n var groupToCopy = mnStoreService.store(\"groups\").get(groupID);\n var copiedGroup = mnStoreService.store(\"groups\").add(groupToCopy);\n copiedGroup.preset = false;\n copiedGroup.charts = (copiedGroup.charts || []).map(function (chartID) {\n var chartToCopy = mnStoreService.store(\"charts\").get(chartID);\n var copiedChart = mnStoreService.store(\"charts\").add(chartToCopy);\n copiedChart.preset = false;\n return copiedChart.id;\n });\n return copiedGroup.id;\n });\n }\n\n function getStatsTitle(stats) {\n return Object.keys(stats).map(function (descPath) {\n var desc = mnStatisticsNewService.readByPath(descPath);\n return desc ? desc.title : descPath.split(\".\").pop();\n }).join(\", \");\n }\n\n function getStatsDesc(stats) {\n return Object.keys(stats).map(function (descPath) {\n var desc = mnStatisticsNewService.readByPath(descPath);\n if (desc) {\n return \"\" + desc.title + \"

\" + desc.desc + \"

\";\n } else {\n return \"\" + descPath.split(\".\").pop() + \"\" +\n \"

There is no such stat name anymore. Edit the chart in order to remove it.

\";\n }\n }).join(\"\");\n }\n\n function getStatsUnits(stats) {\n var units = {};\n Object.keys(stats).forEach(function (descPath) {\n if (!stats[descPath]) {\n return;\n }\n var desc = mnStatisticsNewService.readByPath(descPath);\n if (desc) {\n units[desc.unit] = true;\n }\n });\n return units;\n }\n\n function readByPath(descPath) {\n var paths = descPath.split('.');\n var statsDesc = mnStatisticsDescriptionService.getStats();\n var i;\n\n for (i = 0; i < paths.length; ++i) {\n if (statsDesc[paths[i]] == undefined) {\n return undefined;\n } else {\n statsDesc = statsDesc[paths[i]];\n }\n }\n return statsDesc;\n }\n\n function isPerBucketStat(path) {\n return path.split(\".\")[0].includes(\"-\");\n }\n\n function postStats(perChartConfig) {\n return $http({\n url: '/_uistats',\n method: 'POST',\n mnHttp: {\n group: \"global\",\n isNotForm: true\n },\n data: perChartConfig\n });\n }\n\n function postStatsRange(perChartConfig) {\n return $http({\n url: '/pools/default/stats/range/',\n method: 'POST',\n mnHttp: {\n group: \"global\",\n isNotForm: true\n },\n data: perChartConfig\n });\n }\n\n function getServiceNameFromDescriptionPath(descPath) {\n var splitted = descPath.split(\".\");\n return splitted[0].substring(1, splitted[0].length-1);\n }\n\n function descriptionPathToStatName(descPath, items) {\n if (mnPoolDefault.export.compat.atLeast70) {\n return descPath;\n } else {\n let splitted = descPath.split(\".\");\n let service = getServiceNameFromDescriptionPath(descPath);\n let maybeItem = descPath.includes(\"@items\") && ((items || {})[service])\n return (maybeItem || \"\") + splitted[splitted.length - 1];\n }\n }\n\n function getStatsProp(stats) {\n return Array.isArray(stats) ? stats : Object.keys(stats);\n }\n\n function descriptionPathsToStatNames(stats, items) {\n return getStatsProp(stats).map(function (descPath) {\n return descriptionPathToStatName(descPath, items);\n });\n }\n\n\n function zoomToMS(zoom) {\n switch (zoom) {\n case \"minute\": return 60000;\n case \"hour\": return 3600000;\n case \"day\": return 86400000;\n case \"week\": return 604800000;\n case \"month\": return 2628000000;\n default: return zoom ? zoom : 60000;\n }\n }\n\n function zoomToStep(zoom) {\n if (Number.isFinite(zoom)) {\n return zoom;\n }\n return zoomToMS(zoom) / 60000;\n }\n\n function rangeZoomToSec(zoom) {\n switch(zoom){\n case \"minute\": return zoomToMS(zoom) / 1000 * 2;\n default: return zoomToMS(zoom) / 1000;\n }\n }\n\n function rangeZoomToStep(zoom) {\n switch (zoom) {\n case \"minute\": return 10;\n case \"hour\":\n case \"day\":\n case \"week\":\n case \"month\": return zoomToMS(zoom) / 1000 / 100; //100 - how many steps we have\n default: return zoom ? (zoom / 1000) : 10;\n }\n }\n\n function get70StatUniqueName(cfg) {\n return cfg.metric.name + (cfg.applyFunctions ? (\"_\" + cfg.applyFunctions.join(\"\")) : \"\");\n }\n\n function packStatsConfig(config, doNotAssignStatPath) {\n let cfg = {};\n\n if (config.node !== \"all\") {\n cfg.nodes = [config.node];\n }\n\n if (mnPoolDefault.export.compat.atLeast70) {\n let rv = [];\n\n switchToFullStatInfo(cfg, config);\n\n getStatsProp(config.stats).forEach(statPath => {\n let statDesc = readByPath(statPath);\n if (!statDesc) {\n return;\n }\n let cfg1 = Object.assign(doNotAssignStatPath ? {} : {statPath: statPath}, cfg);\n let service = getServiceNameFromDescriptionPath(statPath);\n cfg1.metric = Object.assign({}, statDesc.metric);\n if (isPerBucketStat(statPath)) {\n if (statDesc.bucket === null) {\n delete cfg1.metric.bucket;\n } else {\n cfg1.metric[statDesc.bucketLabel || \"bucket\"] = config.bucket;\n }\n }\n if (config.scope) {\n cfg1.metric.scope = config.scope;\n }\n if (config.collection) {\n cfg1.metric.collection = config.collection;\n }\n if (config.node == \"all\" && !config.specificStat) {\n cfg1.nodesAggregation = statDesc.nodesAggregation;\n }\n if (statDesc.applyFunctions || config.applyFunctions) {\n cfg1.applyFunctions = statDesc.applyFunctions || config.applyFunctions;\n }\n if (statPath.includes(\"@items\")) {\n cfg1.metric[service] = config.items[service];\n }\n let httpParamsModifier = mnStatisticsDescription.maybeGetLabelsModifier(service);\n if (httpParamsModifier) {\n cfg1 = httpParamsModifier(cfg1);\n }\n cfg1.metric = Object.keys(cfg1.metric).map(labelName => {\n let rv = {};\n let labelValue = cfg1.metric[labelName];\n if (labelValue) {\n rv.label = labelName;\n rv.value = labelValue;\n }\n let operator = mnStatisticsDescription.maybeGetLabelOperator(statPath+\".\"+labelName);\n if (operator) {\n rv.operator = operator;\n }\n return rv;\n });\n if (config.alignTimestamps) {\n cfg1.alignTimestamps = true;\n }\n rv.push(cfg1);\n });\n return rv;\n } else {\n cfg.step = config.step || zoomToStep(config.zoom);\n cfg.startTS = 0 - zoomToMS(config.zoom);\n cfg.stats = descriptionPathsToStatNames(config.stats, config.items);\n cfg.bucket = config.bucket;\n if (config.node == \"all\" && !config.specificStat) {\n cfg.aggregate = true;\n }\n return [cfg];\n }\n }\n\n function prepareNodesList(params) {\n return mnServersService.getNodes().then(function (nodes) {\n var rv = {};\n rv.nodesNames = _(nodes.active).filter(function (node) {\n return !(node.clusterMembership === 'inactiveFailed') && !(node.status === 'unhealthy');\n }).pluck(\"hostname\").value();\n\n rv.nodesNames.unshift(\"All Server Nodes (\" + rv.nodesNames.length + \")\");\n rv.nodesNames.selected = params.statsHostname === \"all\" ? rv.nodesNames[0] : params.statsHostname;\n\n return rv;\n });\n }\n\n function doAddPresetScenario() {\n presetScenario().forEach(function (scenario) {\n scenario.preset = true;\n scenario.groups = scenario.groups.map(function (group) {\n group.preset = true;\n group.charts = group.charts.map(function (chart) {\n chart.preset = true;\n chart = mnStoreService.store(\"charts\").add(chart);\n return chart.id;\n });\n group = mnStoreService.store(\"groups\").add(group);\n return group.id;\n });\n mnStoreService.store(\"scenarios\").add(scenario);\n });\n }\n\n function presetScenario() {\n return [{\n name: \"Cluster Overview\",\n uiid: \"mn-cluster-overview\",\n desc: \"Stats showing the general health of your cluster. Customize and/or make your own dashboard with \\\"new dashboard... \\\" below.\",\n groups: [{\n name: \"Cluster Overview\",\n uiid: \"mn-cluster-overview-group\",\n charts: [{\n stats: {\"@kv-.ops\": true,\n \"@query.query_requests\": true,\n \"@fts-.@items.total_queries\": true,\n \"@kv-.ep_tmp_oom_errors\": true,\n \"@kv-.ep_cache_miss_rate\": true,\n \"@kv-.cmd_get\": true,\n \"@kv-.cmd_set\": true,\n \"@kv-.delete_hits\": true\n },\n size: \"medium\",\n specificStat: false // false for multi-stat chart\n }, {\n stats: {\"@kv-.mem_used\": true,\n \"@kv-.ep_mem_low_wat\": true,\n \"@kv-.ep_mem_high_wat\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.curr_items\": true,\n \"@kv-.vb_replica_curr_items\": true,\n \"@kv-.vb_active_resident_items_ratio\": true,\n \"@kv-.vb_replica_resident_items_ratio\": true,\n \"@kv-.couch_docs_fragmentation\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.disk_write_queue\": true,\n \"@kv-.couch_docs_actual_disk_size\": true},\n size: \"small\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_replica_items_remaining\": true},\n size: \"small\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_data_read_failed\": true,\n \"@kv-.ep_data_write_failed\": true,\n \"@query.query_errors\": true,\n \"@fts-.@items.total_queries_error\": true,\n \"@eventing.eventing/failed_count\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@query.query_requests_250ms\": true,\n \"@query.query_requests_500ms\": true,\n \"@query.query_requests_1000ms\": true,\n \"@query.query_requests_5000ms\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@xdcr-.replication_changes_left\": true,\n \"@index-.@items.num_docs_pending+queued\": true,\n \"@fts-.@items.num_mutations_to_index\": true},\n size: \"medium\",\n specificStat: false\n }]\n }, {\n name: \"Node Resources\",\n charts: [{\n stats: {\"@system.cpu_utilization_rate\": true},\n size: \"medium\",\n specificStat: true // for single-stat chart\n }, {\n stats: {\"@system.rest_requests\": true},\n size: \"medium\",\n specificStat: true\n }, {\n stats: {\"@system.mem_actual_free\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@system.swap_used\": true},\n size: \"medium\",\n specificStat: true\n }]\n }]\n },{ // 2nd scenario starts here with the comma ///////////////////////\n\n name: \"All Services\",\n uiid: \"mn-all-services\",\n desc: \"Most common stats, arranged per service. Customize and/or make your own dashboard with \\\"new dashboard... \\\" below.\",\n groups: [{\n name: \"Data (Docs/Views/XDCR)\",\n uiid: \"mn-all-services-data-group\",\n charts: [{\n stats: {\"@kv-.mem_used\": true,\n \"@kv-.ep_mem_low_wat\": true,\n \"@kv-.ep_mem_high_wat\": true,\n \"@kv-.ep_kv_size\": true,\n \"@kv-.ep_meta_data_memory\": true,\n \"@kv-.vb_active_resident_items_ratio\": true},\n size: \"medium\",\n specificStat: false // false for multi-stat chart\n }, {\n stats: {\"@kv-.ops\": true,\n \"@kv-.ep_cache_miss_rate\": true,\n \"@kv-.cmd_get\": true,\n \"@kv-.cmd_set\": true,\n \"@kv-.delete_hits\": true,\n \"@kv-.ep_num_ops_set_meta\": true\n },\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_items_remaining\": true,\n \"@kv-.ep_dcp_cbas_items_remaining\": true,\n \"@kv-.ep_dcp_replica_items_remaining\": true,\n \"@kv-.ep_dcp_xdcr_items_remaining\": true,\n \"@kv-.ep_dcp_eventing_items_remaining\": true,\n \"@kv-.ep_dcp_other_items_remaining\": true,\n \"@xdcr-.replication_changes_left\": true\n },\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_bg_fetched\": true,\n \"@kv-.ep_data_read_failed\": true,\n \"@kv-.ep_data_write_failed\": true,\n \"@kv-.ep_ops_create\": true,\n \"@kv-.ep_ops_update\": true\n },\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_diskqueue_items\": true},\n size: \"small\",\n specificStat: true\n }]\n }, {\n name: \"Query\",\n charts: [{\n stats: {\"@query.query_requests_1000ms\": true,\n \"@query.query_requests_500ms\": true,\n \"@query.query_requests_5000ms\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@query.query_selects\": true,\n \"@query.query_requests\": true,\n \"@query.query_warnings\": true,\n \"@query.query_invalid_requests\": true,\n \"@query.query_errors\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@query.query_avg_req_time\": true,\n \"@query.query_avg_svc_time\": true},\n size: \"small\",\n specificStat: false\n }, {\n stats: {\"@query.query_avg_result_count\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@query.query_avg_response_size\": true},\n size: \"small\",\n specificStat: false\n }]\n }, {\n name: \"Index\",\n charts: [{\n stats: {\"@index-.index/num_rows_returned\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@index-.@items.num_docs_pending+queued\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@index-.index/data_size\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@index-.index/disk_size\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@index.index_ram_percent\": true,\n \"@index.index_remaining_ram\": true,\n \"@index-.index/data_size\": true,\n \"@index-.index/disk_size\": true},\n size: \"medium\",\n specificStat: false\n }]\n }, {\n name: \"Search\",\n charts: [{\n stats: {\"@fts-.fts/num_bytes_used_disk\": true,\n \"@fts.fts_num_bytes_used_ram\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@fts-.@items.total_queries\": true,\n \"@fts-.@items.total_queries_error\": true,\n \"@fts-.@items.total_queries_slow\": true,\n \"@fts-.@items.total_queries_timeout\": true,\n \"@fts.fts_total_queries_rejected_by_herder\": true},\n size: \"medium\",\n specificStat: false\n }]\n }, {\n name: \"Analytics\",\n enterprise: true,\n charts: [{\n stats: {\"@cbas-.cbas/incoming_records_count\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas-.cbas_failed_to_parse_records_count\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas-.cbas/failed_at_parser_records_count_total\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_heap_used\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_heap_memory_committed_bytes\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_thread_count\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_disk_used\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_io_reads\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_io_writes\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_system_load_average\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_pending_merge_ops\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@cbas.cbas_pending_flush_ops\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@system.sysproc_mem_resident_java_cbas\": true},\n size: \"small\",\n specificStat: true\n }]\n }, {\n name: \"Eventing\",\n enterprise: true,\n charts: [{\n stats: {\"@eventing.eventing/failed_count\": true,\n \"@eventing.eventing/timeout_count\": true},\n size: \"small\",\n specificStat: false\n }]\n }, {\n name: \"XDCR\",\n charts: [{\n stats: {\"@xdcr-.replication_changes_left\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@xdcr-.@items.changes_left\": true},\n size: \"small\",\n specificStat: true\n }, {\n stats: {\"@xdcr-.@items.wtavg_docs_latency\": true,\n \"@xdcr-.@items.wtavg_meta_latency\": true},\n size: \"small\",\n specificStat: false\n }, {\n stats: {\"@xdcr-.@items.docs_failed_cr_source\": true,\n \"@xdcr-.@items.xdcr_docs_failed_cr_target_total\": true,\n \"@xdcr-.@items.docs_filtered\": true},\n size: \"small\",\n specificStat: false\n }]\n }, {\n name: \"vBucket Resources\",\n charts: [{\n stats: {\"@kv-.vb_active_num\": true,\n \"@kv-.vb_replica_num\": true,\n \"@kv-.vb_pending_num\": true,\n \"@kv-.ep_vb_total\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.curr_items\": true,\n \"@kv-.vb_replica_curr_items\": true,\n \"@kv-.vb_pending_curr_items\": true,\n \"@kv-.curr_items_tot\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_resident_items_ratio\": true,\n \"@kv-.vb_replica_resident_items_ratio\": true,\n \"@kv-.vb_pending_resident_items_ratio\": true,\n \"@kv-.ep_resident_items_rate\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_ops_create\": true,\n \"@kv-.vb_replica_ops_create\": true,\n \"@kv-.vb_pending_ops_create\": true,\n \"@kv-.ep_ops_create\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_eject\": true,\n \"@kv-.vb_replica_eject\": true,\n \"@kv-.vb_pending_eject\": true,\n \"@kv-.ep_num_value_ejects\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_itm_memory\": true,\n \"@kv-.vb_replica_itm_memory\": true,\n \"@kv-.vb_pending_itm_memory\": true,\n \"@kv-.ep_kv_size\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_meta_data_memory\": true,\n \"@kv-.vb_replica_meta_data_memory\": true,\n \"@kv-.vb_pending_meta_data_memory\": true,\n \"@kv-.ep_meta_data_memory\": true},\n size: \"medium\",\n specificStat: false\n }]\n }, {\n name: \"DCP Queues\",\n charts: [{\n stats: {\"@kv-.ep_dcp_views+indexes_count\": true,\n \"@kv-.ep_dcp_cbas_count\": true,\n \"@kv-.ep_dcp_replica_count\": true,\n \"@kv-.ep_dcp_xdcr_count\": true,\n \"@kv-.ep_dcp_eventing_count\": true,\n \"@kv-.ep_dcp_other_count\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_producer_count\": true,\n \"@kv-.ep_dcp_cbas_producer_count\": true,\n \"@kv-.ep_dcp_replica_producer_count\": true,\n \"@kv-.ep_dcp_xdcr_producer_count\": true,\n \"@kv-.ep_dcp_eventing_producer_count\": true,\n \"@kv-.ep_dcp_other_producer_count\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_items_remaining\": true,\n \"@kv-.ep_dcp_cbas_items_remaining\": true,\n \"@kv-.ep_dcp_replica_items_remaining\": true,\n \"@kv-.ep_dcp_xdcr_items_remaining\": true,\n \"@kv-.ep_dcp_eventing_items_remaining\": true,\n \"@kv-.ep_dcp_other_items_remaining\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_items_sent\": true,\n \"@kv-.ep_dcp_cbas_items_sent\": true,\n \"@kv-.ep_dcp_replica_items_sent\": true,\n \"@kv-.ep_dcp_xdcr_items_sent\": true,\n \"@kv-.ep_dcp_eventing_items_sent\": true,\n \"@kv-.ep_dcp_other_items_sent\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_total_bytes\": true,\n \"@kv-.ep_dcp_cbas_total_bytes\": true,\n \"@kv-.ep_dcp_replica_total_bytes\": true,\n \"@kv-.ep_dcp_xdcr_total_bytes\": true,\n \"@kv-.ep_dcp_eventing_total_bytes\": true,\n \"@kv-.ep_dcp_other_total_bytes\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.ep_dcp_views+indexes_backoff\": true,\n \"@kv-.ep_dcp_cbas_backoff\": true,\n \"@kv-.ep_dcp_replica_backoff\": true,\n \"@kv-.ep_dcp_xdcr_backoff\": true,\n \"@kv-.ep_dcp_eventing_backoff\": true,\n \"@kv-.ep_dcp_other_backoff\": true},\n size: \"medium\",\n specificStat: false\n }]\n }, {\n name: \"Disk Queues\",\n charts: [{\n stats: {\"@kv-.ep_diskqueue_fill\": true,\n \"@kv-.ep_diskqueue_drain\": true,\n \"@kv-.ep_diskqueue_items\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_active_queue_fill\": true,\n \"@kv-.vb_active_queue_drain\": true,\n \"@kv-.vb_active_queue_size\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_replica_queue_fill\": true,\n \"@kv-.vb_replica_queue_drain\": true,\n \"@kv-.vb_replica_queue_size\": true},\n size: \"medium\",\n specificStat: false\n }, {\n stats: {\"@kv-.vb_pending_queue_fill\": true,\n \"@kv-.vb_pending_queue_drain\": true,\n \"@kv-.vb_pending_queue_size\": true},\n size: \"medium\",\n specificStat: false\n }]\n }]\n }]\n }\n}\n"], "mappings": "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", "names": [] }