Compare commits

...

88 Commits

Author SHA1 Message Date
ning
cbcd2a0ca1 refactor 2024-05-24 12:13:17 +08:00
ning
3f865e2d19 code refactor 2024-05-22 10:47:37 +08:00
ning
e3ea65d098 code refactor 2024-05-22 10:34:34 +08:00
赵尚
93159f07fd refactor: change the task time limit from 1 day to 5 days. (#1959) 2024-05-21 15:32:45 +08:00
Yening Qin
7d410baa2d refactor: recovery event support inhibit (#1958) 2024-05-20 20:35:35 +08:00
Ulric Qin
20b30c3e2c update ping metrics 2024-05-20 10:26:18 +08:00
Ulric Qin
8805bf6598 fix typo of logout router 2024-05-20 10:23:08 +08:00
Ulric Qin
fe6a64dae8 Merge branch 'main' of github.com:ccfos/nightingale 2024-05-20 10:22:39 +08:00
Ulric Qin
2c564a2c58 add cdn metrics doc 2024-05-20 10:22:16 +08:00
ulricqin
ae3c13224d Update host_generic_categraf.json 2024-05-17 10:52:22 +08:00
ulricqin
9a4015f13f Update host_generic_categraf.json 2024-05-16 17:46:48 +08:00
Yening Qin
274ca09551 Update switch branch.json 2024-05-16 13:44:08 +08:00
ulricqin
3d9b4fc14e Update categraf-procstat.json 2024-05-16 11:38:53 +08:00
ning
07436a5e0d refactor: change event order 2024-05-16 11:15:18 +08:00
ning
f7b2f1acb9 refactor: change event order 2024-05-16 11:08:35 +08:00
ning
4f4287030a docs: update snmp board tpl 2024-05-15 22:19:14 +08:00
ning
e25e712c48 refactor: change boards clone api 2024-05-15 22:16:16 +08:00
ning
66951d7e77 refactor: change boards clone api 2024-05-14 14:24:32 +08:00
ulricqin
f5ff27cd18 Create host_generic_categraf.json 2024-05-13 18:03:54 +08:00
ning
9e3f6e6285 refactor: add create user verify 2024-05-13 17:25:08 +08:00
ning
48e3df2cb4 refactor: new ldap conn 2024-05-13 17:07:18 +08:00
Yening Qin
ac5d69dba4 feat: ldap support role mapping (#1948)
* feature: LDAP implements role mapping capabilities (#1932)

* feature: Implement the team mapping function (#1934)

* refactor: ldap login add timeout

---------

Co-authored-by: Ciusyan <101268302+Yziyan@users.noreply.github.com>
Co-authored-by: ciusyan <yangzhiyan_i@didiglobal.com>
2024-05-13 16:56:19 +08:00
Ulric Qin
597351c424 code refactor 2024-05-13 10:39:27 +08:00
Ulric Qin
1f6b2e341a update README 2024-05-13 10:28:19 +08:00
ulricqin
035752ace2 Update README.md 2024-05-13 10:15:55 +08:00
ulricqin
60a1437207 Update README.md 2024-05-13 10:12:58 +08:00
ulricqin
e31414bc8c Update README.md 2024-05-13 10:12:08 +08:00
ning
785a294845 refactor: update event.TriggerValue 2024-05-11 11:17:38 +08:00
ning
98933eee34 docs: update sql 2024-05-10 16:32:05 +08:00
ulricqin
20905810d7 Delete integrations/Netstat/metrics directory 2024-05-10 15:30:08 +08:00
ulricqin
c1bde83639 Delete integrations/Kernel_Vmstat/metrics directory 2024-05-10 15:29:30 +08:00
ulricqin
782a0e9616 Delete integrations/Processes/metrics directory 2024-05-10 15:28:50 +08:00
ning
6a3720bc8b docs: update ops 2024-05-10 14:19:49 +08:00
ning
de252359d6 Merge branch 'main' of github.com:ccfos/nightingale 2024-05-10 14:11:54 +08:00
ning
deb313ca3d refactor: change server and server clusters routes to include permission check 2024-05-10 14:11:32 +08:00
yang xiaokai
d119de56be docs: creating SNMP monitoring for Cisco like switches (#1945)
* Add files via upload

* Add files via upload

* Update and rename DCN.toml to Cisco.toml

---------

Co-authored-by: Yening Qin <710leo@gmail.com>
2024-05-10 13:27:24 +08:00
tuogege
f05417fa23 docs: fix wrong table name about 'WriteRelabels' (#1942) 2024-05-10 11:56:28 +08:00
ning
9ab2eb591f docs: update integration 2024-05-10 10:55:22 +08:00
Yening Qin
3f476d770f feat: add builtin metrics (#1944) 2024-05-10 10:41:51 +08:00
ning
ced6759686 Merge branch 'main' of github.com:ccfos/nightingale 2024-05-09 16:48:43 +08:00
ning
eba3014c59 fix: alert engine rebuild hash 2024-05-09 16:48:29 +08:00
ulricqin
3aeb4e16e9 Update webhook.go. Refactor Host header settings 2024-05-09 15:54:37 +08:00
ning
3b62722251 refactor: change server and server clusters routes to include permission check 2024-05-09 11:42:09 +08:00
shardingHe
fb1cc4868e feat: add user variable for sso(decrypted). (#1936)
* add user variable for sso(decrypted).
---------

Co-authored-by: shardingHe <wangzihe@flashcat.cloud>
2024-05-08 14:10:25 +08:00
ning
4a0dcf0dbf refactor: add forbidden status check for empty group id list 2024-05-08 11:59:13 +08:00
ning
4f913f146e Remove table prefix from all config files for consistency 2024-05-07 21:04:12 +08:00
Ulric Qin
533560f432 Merge branch 'main' of github.com:ccfos/nightingale 2024-05-07 20:03:52 +08:00
Ulric Qin
cf7b479a1b update integration metrics 2024-05-07 20:01:41 +08:00
Yening Qin
2e4c29a0de docs: delete integrations/Ping/collect/ping2.toml 2024-05-07 12:21:43 +08:00
Ulric Qin
6f0ceb94c6 Merge branch 'main' of github.com:ccfos/nightingale 2024-04-29 16:57:08 +08:00
Ulric Qin
800d7ba04b update integrations metrics 2024-04-29 16:56:56 +08:00
Thomas Zhao
fb6a6d2b93 Resolve a problem of pushgw WriteRrelabel not working actually (#1928)
* fix: timeSeries is not updated after relabeled

* fix: GaugeSampleQueueSize defined but not registered

---------

Co-authored-by: zhaotuo <zhaotuo@mail.jj.cn>
2024-04-29 10:22:17 +08:00
ning
cf2b19ae90 Update the size of callbacks and runbook_url columns to varchar(4096) in the alert_rule table 2024-04-28 11:56:52 +08:00
Ulric Qin
fb1cc93613 Merge branch 'main' of github.com:ccfos/nightingale 2024-04-26 19:27:07 +08:00
Ulric Qin
c2bba796c2 add some integrations metrics 2024-04-26 19:26:53 +08:00
ning
a02bf83842 fix: query busigroup error by checking if t is not nil before accessing its GroupId property 2024-04-25 17:18:50 +08:00
ning
cd9f129e2d docs: remove memory metric reference from dashboard descriptions 2024-04-22 17:30:03 +08:00
dependabot[bot]
e85c80bdcf build(deps): bump golang.org/x/net from 0.17.0 to 0.23.0 (#1921)
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.17.0 to 0.23.0.
- [Commits](https://github.com/golang/net/compare/v0.17.0...v0.23.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-04-22 10:52:44 +08:00
Ciusyan
7e83e0c482 Add fields to the users interface and fix email sending bugs (#1919)
* fix: SMTP configuration error may not exit the current sending email goroutine

* optimize: Add user information fields

---------

Co-authored-by: ciusyan <yangzhiyan_i@didiglobal.com>
2024-04-22 10:45:23 +08:00
ning
92ac3125f3 refactor: change ibex version 2024-04-19 00:05:20 +08:00
ning
a61feca369 Merge branch 'main' of github.com:ccfos/nightingale 2024-04-17 17:32:06 +08:00
ning
8b0b811919 Refactor redundant code for initializing Redis storage in alert/alert.go and cmd/edge/edge.go 2024-04-17 17:31:53 +08:00
Ulric Qin
8742526c7f check configDir exists 2024-04-17 17:29:49 +08:00
ning
ee757cfd92 Enable PProf for profiling and monitoring in config.toml 2024-04-17 16:54:00 +08:00
ulricqin
b12cfea379 Update edge.toml 2024-04-17 16:34:27 +08:00
kongfei605
45365e3e03 chore: update dashboards for ipmi (#1913) 2024-04-16 19:44:08 +08:00
kongfei605
1b676eefd2 Merge pull request #1912 from shardingHe/sync_dashboard_impi_and_sqlserver
docs: sync ipmi & sqlserver dashboards
2024-04-16 13:36:32 +08:00
shardingHe
0092dc44fd sync ipmi & sqlserver dashboards
update ipmi collect config
2024-04-16 13:05:12 +08:00
shardingHe
4941b376f3 feat: update buildIn dashboard custom (#1911) 2024-04-12 15:06:31 +08:00
ulricqin
e46813cd17 Update docker-compose.yaml 2024-04-12 10:02:48 +08:00
ning
58ebd224c2 refactor: change datasource api 2024-04-09 15:06:56 +08:00
ning
95ece6e16f refactor: update endpoint for deleting a datasource to remove unnecessary trailing slash 2024-04-09 15:04:38 +08:00
ning
b82cbd06fa merge main 2024-04-09 14:23:10 +08:00
ning
16210892da docs: change dockerfile 2024-04-09 14:10:52 +08:00
Ulric Qin
a452d63a56 Merge branch 'main' of github.com:ccfos/nightingale 2024-04-09 13:53:14 +08:00
Ulric Qin
51c7abedd3 Delete Dockerfile 2024-04-09 13:52:59 +08:00
ning
6d0a2420a8 Merge branch 'main' of github.com:ccfos/nightingale 2024-04-09 10:25:26 +08:00
ning
9cf687b73d fix: ldap user login info sync 2024-04-09 10:25:10 +08:00
ulricqin
49c9e41df5 Update host_table_view_demo.json 2024-04-08 16:01:31 +08:00
ning
2ec2e64213 refactor: Remove redundant DB2FE function from models 2024-04-08 15:29:19 +08:00
ning
867a61c8dc docs: change docker compose config 2024-04-07 19:36:36 +08:00
HongKuang
12263d1453 chore: fix function name in comment (#1905)
Signed-off-by: hongkuang <liurenhong@outlook.com>
2024-04-07 18:50:06 +08:00
Yening Qin
c0cacb2e64 refactor: change docker compose (#1906)
* update init sql

* change compose config
2024-04-07 18:49:32 +08:00
ning
0637b343b1 refactor: update ibex version 2024-04-06 23:21:10 +08:00
ning
2473e144ef refactor: update ibex version 2024-04-06 23:19:38 +08:00
Yening Qin
00a37d6de7 feat: Integration ibex (#1904)
* Ibex integrate (#1876)

---------

Co-authored-by: Deke Wang <94156972+wdkcc@users.noreply.github.com>
2024-04-06 22:02:07 +08:00
ning
50c664e6bf code refactor 2024-04-03 15:37:31 +08:00
Yening Qin
22b7d20455 refactor: sync user info to duty (#1903) 2024-04-02 21:49:32 +08:00
197 changed files with 18540 additions and 9993 deletions

View File

@@ -28,35 +28,55 @@
[English](./README_en.md) | [中文](./README.md)
## 夜莺 Nightingale 是什么
夜莺 Nightingale 是中国计算机学会接受捐赠并托管的第一个开源项目,是一个 All-in-One 的云原生监控工具,集合了 Prometheus 和 Grafana 的优点,你可以在 WebUI 上管理和配置告警策略,也可以对分布在多个 Region 的指标、日志、链路追踪数据进行统一的可视化和分析。夜莺融入了一线互联网公司可观测性最佳实践,沉淀了众多社区专家经验,开箱即用。[了解更多...](https://flashcat.cloud/product/nightingale/)
夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集数据采集、可视化、监控告警、数据分析于一体,与云原生生态紧密集成,提供开箱即用的企业级监控分析和告警能力。夜莺于 2020 年 3 月 20 日,在 github 上发布 v1 版本,已累计迭代 100 多个版本。
夜莺最初由滴滴开发和开源,并于 2022 年 5 月 11 日捐赠予中国计算机学会开源发展委员会CCF ODC为 CCF ODC 成立后接受捐赠的第一个开源项目。夜莺的核心研发团队,也是 Open-Falcon 项目原核心研发人员,从 2014 年Open-Falcon 是 2014 年开源)算起来,也有 10 年了,只为把监控这个事情做好。
## 快速开始
- 👉[文档](https://flashcat.cloud/docs/) | [提问](https://answer.flashcat.cloud/) | [下载](https://flashcat.cloud/download/nightingale/) | [安装](https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/install/intro/)
- 👉[文档中心](https://flashcat.cloud/docs/) | [下载中心](https://flashcat.cloud/download/nightingale/)
- ❤️[报告 Bug](https://github.com/ccfos/nightingale/issues/new?assignees=&labels=kind%2Fbug&projects=&template=bug_report.yml)
- ℹ️为了提供更快速的访问体验,上述文档和下载站点托管于 [FlashcatCloud](https://flashcat.cloud)
## 功能特点
- 对接多种时序库:支持对接 Prometheus、VictoriaMetrics、Thanos、Mimir、M3DB、TDengine 等多种时序库,实现统一告警管理。
- 专业告警能力:内置支持多种告警规则,可以扩展支持常见通知媒介,支持告警屏蔽/抑制/聚合/自愈、告警事件管理。
- 专业告警能力:内置支持多种告警规则,可以扩展支持常见通知媒介,支持告警屏蔽/抑制/订阅/自愈、告警事件管理。
- 高性能可视化引擎:支持多种图表样式,内置众多 Dashboard 模版,也可导入 Grafana 模版,开箱即用,开源协议商业友好。
- 支持常见采集器:支持 [Categraf](https://flashcat.cloud/product/categraf)、Telegraf、Grafana-agent、Datadog-agent、各种 Exporter 作为采集器,没有什么数据是不能监控的。
- 一体化观测平台:从 V6 版本开始,支持对接 ElasticSearch、Jaeger 数据源,实现日志、链路、指标多维度的统一可观测。
- 👀无缝搭配 [Flashduty](https://flashcat.cloud/product/flashcat-duty/)实现告警聚合收敛、认领、升级、排班、IM集成确保告警处理不遗漏减少打扰高效协同。
## 功能演示
![演示](https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/n9e/n9e-demo.gif)
## 截图演示
## 部署架构
<p align=center>中心化部署</p>
即时查询,类似 Prometheus 内置的查询分析页面,做 ad-hoc 查询,夜莺做了一些 UI 优化,同时提供了一些内置 promql 指标,让不太了解 promql 的用户也可以快速查询。
![中心化部署](https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/flashcat/images/blog/n9e-opensource-china/8.png)
![即时查询](https://download.flashcat.cloud/ulric/20240513103305.png)
<p align=center>多机房部署</p>
当然,也可以直接通过指标视图查看,有了指标视图,即时查询基本可以不用了,或者只有高端玩家使用即时查询,普通用户直接通过指标视图查询即可。
![多机房部署](https://fcpub-1301667576.cos.ap-nanjing.myqcloud.com/flashcat/images/blog/n9e-opensource-china/9.png)
![指标视图](https://download.flashcat.cloud/ulric/20240513103530.png)
夜莺内置了常用仪表盘,可以直接导入使用。也可以导入 Grafana 仪表盘,不过只能兼容 Grafana 基本图表,如果已经习惯了 Grafana 建议继续使用 Grafana 看图,把夜莺作为一个告警引擎使用。
![内置仪表盘](https://download.flashcat.cloud/ulric/20240513103628.png)
除了内置的仪表盘,也内置了很多告警规则,开箱即用。
![内置告警规则](https://download.flashcat.cloud/ulric/20240513103825.png)
## 产品架构
社区使用夜莺最多的场景就是使用夜莺做告警引擎,对接多套时序库,统一告警规则管理。绘图仍然使用 Grafana 居多。作为一个告警引擎,夜莺的产品架构如下:
![产品架构](https://download.flashcat.cloud/ulric/20240221152601.png)
对于个别边缘机房,如果和中心夜莺服务端网络链路不好,希望提升告警可用性,我们也提供边缘机房告警引擎下沉部署模式,这个模式下,即便网络割裂,告警功能也不受影响。
![边缘部署模式](https://download.flashcat.cloud/ulric/20240222102119.png)
## 交流渠道
- 报告Bug优先推荐提交[夜莺GitHub Issue](https://github.com/ccfos/nightingale/issues/new?assignees=&labels=kind%2Fbug&projects=&template=bug_report.yml)
@@ -76,4 +96,4 @@
</a>
## License
- [Apache License V2.0](https://github.com/didi/nightingale/blob/main/LICENSE)
- [Apache License V2.0](https://github.com/didi/nightingale/blob/main/LICENSE)

View File

@@ -46,13 +46,6 @@ type RedisPub struct {
ChannelKey string
}
type Ibex struct {
Address string
BasicAuthUser string
BasicAuthPass string
Timeout int64
}
func (a *Alert) PreCheck(configDir string) {
if a.Alerting.TemplatesDir == "" {
a.Alerting.TemplatesDir = path.Join(configDir, "template")

View File

@@ -24,7 +24,10 @@ import (
"github.com/ccfos/nightingale/v6/prom"
"github.com/ccfos/nightingale/v6/pushgw/pconf"
"github.com/ccfos/nightingale/v6/pushgw/writer"
"github.com/ccfos/nightingale/v6/storage"
"github.com/ccfos/nightingale/v6/tdengine"
"github.com/flashcatcloud/ibex/src/cmd/ibex"
)
func Initialize(configDir string, cryptoKey string) (func(), error) {
@@ -40,6 +43,12 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
ctx := ctx.NewContext(context.Background(), nil, false, config.CenterApi)
var redis storage.Redis
redis, err = storage.NewRedis(config.Redis)
if err != nil {
return nil, err
}
syncStats := memsto.NewSyncStats()
alertStats := astats.NewSyncStats()
@@ -52,16 +61,22 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
dsCache := memsto.NewDatasourceCache(ctx, syncStats)
userCache := memsto.NewUserCache(ctx, syncStats)
userGroupCache := memsto.NewUserGroupCache(ctx, syncStats)
taskTplsCache := memsto.NewTaskTplCache(ctx)
promClients := prom.NewPromClient(ctx)
tdengineClients := tdengine.NewTdengineClient(ctx, config.Alert.Heartbeat)
externalProcessors := process.NewExternalProcessors()
Start(config.Alert, config.Pushgw, syncStats, alertStats, externalProcessors, targetCache, busiGroupCache, alertMuteCache, alertRuleCache, notifyConfigCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
Start(config.Alert, config.Pushgw, syncStats, alertStats, externalProcessors, targetCache, busiGroupCache, alertMuteCache, alertRuleCache, notifyConfigCache, taskTplsCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
r := httpx.GinEngine(config.Global.RunMode, config.HTTP)
rt := router.New(config.HTTP, config.Alert, alertMuteCache, targetCache, busiGroupCache, alertStats, ctx, externalProcessors)
if config.Ibex.Enable {
ibex.ServerStart(false, nil, redis, config.HTTP.APIForService.BasicAuth, config.Alert.Heartbeat, &config.CenterApi, r, nil, config.Ibex, config.HTTP.Port)
}
rt.Config(r)
dumper.ConfigRouter(r)
@@ -74,7 +89,7 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
}
func Start(alertc aconf.Alert, pushgwc pconf.Pushgw, syncStats *memsto.Stats, alertStats *astats.Stats, externalProcessors *process.ExternalProcessorsType, targetCache *memsto.TargetCacheType, busiGroupCache *memsto.BusiGroupCacheType,
alertMuteCache *memsto.AlertMuteCacheType, alertRuleCache *memsto.AlertRuleCacheType, notifyConfigCache *memsto.NotifyConfigCacheType, datasourceCache *memsto.DatasourceCacheType, ctx *ctx.Context,
alertMuteCache *memsto.AlertMuteCacheType, alertRuleCache *memsto.AlertRuleCacheType, notifyConfigCache *memsto.NotifyConfigCacheType, taskTplsCache *memsto.TaskTplCache, datasourceCache *memsto.DatasourceCacheType, ctx *ctx.Context,
promClients *prom.PromClientMap, tdendgineClients *tdengine.TdengineClientMap, userCache *memsto.UserCacheType, userGroupCache *memsto.UserGroupCacheType) {
alertSubscribeCache := memsto.NewAlertSubscribeCache(ctx, syncStats)
recordingRuleCache := memsto.NewRecordingRuleCache(ctx, syncStats)
@@ -90,7 +105,7 @@ func Start(alertc aconf.Alert, pushgwc pconf.Pushgw, syncStats *memsto.Stats, al
eval.NewScheduler(alertc, externalProcessors, alertRuleCache, targetCache, targetsOfAlertRulesCache,
busiGroupCache, alertMuteCache, datasourceCache, promClients, tdendgineClients, naming, ctx, alertStats)
dp := dispatch.NewDispatch(alertRuleCache, userCache, userGroupCache, alertSubscribeCache, targetCache, notifyConfigCache, alertc.Alerting, ctx, alertStats)
dp := dispatch.NewDispatch(alertRuleCache, userCache, userGroupCache, alertSubscribeCache, targetCache, notifyConfigCache, taskTplsCache, alertc.Alerting, ctx, alertStats)
consumer := dispatch.NewConsumer(alertc.Alerting, ctx, dp)
go dp.ReloadTpls()

View File

@@ -26,6 +26,7 @@ type Dispatch struct {
alertSubscribeCache *memsto.AlertSubscribeCacheType
targetCache *memsto.TargetCacheType
notifyConfigCache *memsto.NotifyConfigCacheType
taskTplsCache *memsto.TaskTplCache
alerting aconf.Alerting
@@ -43,7 +44,7 @@ type Dispatch struct {
// 创建一个 Notify 实例
func NewDispatch(alertRuleCache *memsto.AlertRuleCacheType, userCache *memsto.UserCacheType, userGroupCache *memsto.UserGroupCacheType,
alertSubscribeCache *memsto.AlertSubscribeCacheType, targetCache *memsto.TargetCacheType, notifyConfigCache *memsto.NotifyConfigCacheType,
alerting aconf.Alerting, ctx *ctx.Context, astats *astats.Stats) *Dispatch {
taskTplsCache *memsto.TaskTplCache, alerting aconf.Alerting, ctx *ctx.Context, astats *astats.Stats) *Dispatch {
notify := &Dispatch{
alertRuleCache: alertRuleCache,
userCache: userCache,
@@ -51,6 +52,7 @@ func NewDispatch(alertRuleCache *memsto.AlertRuleCacheType, userCache *memsto.Us
alertSubscribeCache: alertSubscribeCache,
targetCache: targetCache,
notifyConfigCache: notifyConfigCache,
taskTplsCache: taskTplsCache,
alerting: alerting,
@@ -241,7 +243,7 @@ func (e *Dispatch) Send(rule *models.AlertRule, event *models.AlertCurEvent, not
}
// handle event callbacks
sender.SendCallbacks(e.ctx, notifyTarget.ToCallbackList(), event, e.targetCache, e.userCache, e.notifyConfigCache.GetIbex(), e.Astats)
sender.SendCallbacks(e.ctx, notifyTarget.ToCallbackList(), event, e.targetCache, e.userCache, e.taskTplsCache, e.Astats)
// handle global webhooks
sender.SendWebhooks(notifyTarget.ToWebhookList(), event, e.Astats)

View File

@@ -128,10 +128,37 @@ func (arw *AlertRuleWorker) Eval() {
return
}
for _, point := range recoverPoints {
str := fmt.Sprintf("%v", point.Value)
arw.processor.RecoverSingle(process.Hash(cachedRule.Id, arw.processor.DatasourceId(), point), point.Timestamp, &str)
if arw.inhibit {
pointsMap := make(map[string]common.AnomalyPoint)
for _, point := range recoverPoints {
// 对于恢复的事件,合并处理
tagHash := process.TagHash(point)
p, exists := pointsMap[tagHash]
if !exists {
pointsMap[tagHash] = point
continue
}
if p.Severity > point.Severity {
hash := process.Hash(cachedRule.Id, arw.processor.DatasourceId(), p)
arw.processor.DeleteProcessEvent(hash)
pointsMap[tagHash] = point
}
}
for _, point := range pointsMap {
str := fmt.Sprintf("%v", point.Value)
arw.processor.RecoverSingle(process.Hash(cachedRule.Id, arw.processor.DatasourceId(), point), point.Timestamp, &str)
}
} else {
for _, point := range recoverPoints {
str := fmt.Sprintf("%v", point.Value)
arw.processor.RecoverSingle(process.Hash(cachedRule.Id, arw.processor.DatasourceId(), point), point.Timestamp, &str)
}
}
arw.processor.Handle(anomalyPoints, "inner", arw.inhibit)
}

View File

@@ -67,6 +67,12 @@ func (chr *DatasourceHashRingType) Set(datasourceId string, r *consistent.Consis
chr.Rings[datasourceId] = r
}
func (chr *DatasourceHashRingType) Del(datasourceId string) {
chr.Lock()
defer chr.Unlock()
delete(chr.Rings, datasourceId)
}
func (chr *DatasourceHashRingType) Clear(engineName string) {
chr.Lock()
defer chr.Unlock()

View File

@@ -79,25 +79,48 @@ func (n *Naming) loopHeartbeat() {
func (n *Naming) heartbeat() error {
var datasourceIds []int64
var myDatasourceIds []int64
var err error
// 在页面上维护实例和集群的对应关系
datasourceIds, err = models.GetDatasourceIdsByEngineName(n.ctx, n.heartbeatConfig.EngineName)
if err != nil {
return err
// 如果是中心机房的 leader 机器,沟通全量的数据源的 hash ring给智能告警模块使用
if n.IamLeader() {
datasources, err := models.GetDatasources(n.ctx)
if err != nil {
logger.Warningf("get datasources err:%v", err)
return err
}
for i := 0; i < len(datasources); i++ {
datasourceIds = append(datasourceIds, datasources[i].Id)
}
myDatasourceIds, err = models.GetDatasourceIdsByEngineName(n.ctx, n.heartbeatConfig.EngineName)
if err != nil {
logger.Warningf("get datasource ids by engine name err:%v", err)
return err
}
} else {
// 在页面上维护实例和集群的对应关系
datasourceIds, err = models.GetDatasourceIdsByEngineName(n.ctx, n.heartbeatConfig.EngineName)
if err != nil {
return err
}
myDatasourceIds = datasourceIds
}
if len(datasourceIds) == 0 {
// 上报心跳
if len(myDatasourceIds) == 0 {
err := models.AlertingEngineHeartbeatWithCluster(n.ctx, n.heartbeatConfig.Endpoint, n.heartbeatConfig.EngineName, 0)
if err != nil {
logger.Warningf("heartbeat with cluster %s err:%v", "", err)
n.astats.CounterHeartbeatErrorTotal.WithLabelValues().Inc()
}
} else {
for i := 0; i < len(datasourceIds); i++ {
err := models.AlertingEngineHeartbeatWithCluster(n.ctx, n.heartbeatConfig.Endpoint, n.heartbeatConfig.EngineName, datasourceIds[i])
for i := 0; i < len(myDatasourceIds); i++ {
err := models.AlertingEngineHeartbeatWithCluster(n.ctx, n.heartbeatConfig.Endpoint, n.heartbeatConfig.EngineName, myDatasourceIds[i])
if err != nil {
logger.Warningf("heartbeat with cluster %d err:%v", datasourceIds[i], err)
logger.Warningf("heartbeat with cluster %d err:%v", myDatasourceIds[i], err)
n.astats.CounterHeartbeatErrorTotal.WithLabelValues().Inc()
}
}
@@ -110,7 +133,9 @@ func (n *Naming) heartbeat() error {
}
}
newDatasource := make(map[int64]struct{})
for i := 0; i < len(datasourceIds); i++ {
newDatasource[datasourceIds[i]] = struct{}{}
servers, err := n.ActiveServers(datasourceIds[i])
if err != nil {
logger.Warningf("hearbeat %d get active server err:%v", datasourceIds[i], err)
@@ -130,6 +155,13 @@ func (n *Naming) heartbeat() error {
localss[datasourceIds[i]] = newss
}
for dsId := range localss {
if _, exists := newDatasource[dsId]; !exists {
delete(localss, dsId)
DatasourceHashRing.Del(fmt.Sprintf("%d", dsId))
}
}
// host 告警使用的是 hash ring
err = models.AlertingEngineHeartbeatWithCluster(n.ctx, n.heartbeatConfig.Endpoint, n.heartbeatConfig.EngineName, HostDatasource)
if err != nil {

View File

@@ -165,7 +165,7 @@ func (p *Processor) Handle(anomalyPoints []common.AnomalyPoint, from string, inh
p.handleEvent(events)
}
p.HandleRecover(alertingKeys, now)
p.HandleRecover(alertingKeys, now, inhibit)
}
func (p *Processor) BuildEvent(anomalyPoint common.AnomalyPoint, from string, now int64) *models.AlertCurEvent {
@@ -207,6 +207,11 @@ func (p *Processor) BuildEvent(anomalyPoint common.AnomalyPoint, from string, no
event.ExtraConfig = p.rule.ExtraConfigJSON
event.PromQl = anomalyPoint.Query
if event.TriggerValues != "" && strings.Count(event.TriggerValues, "$") > 1 {
// TriggerValues 有多个变量,将多个变量都放到 TriggerValue 中
event.TriggerValue = event.TriggerValues
}
if from == "inner" {
event.LastEvalTime = now
} else {
@@ -215,7 +220,7 @@ func (p *Processor) BuildEvent(anomalyPoint common.AnomalyPoint, from string, no
return event
}
func (p *Processor) HandleRecover(alertingKeys map[string]struct{}, now int64) {
func (p *Processor) HandleRecover(alertingKeys map[string]struct{}, now int64, inhibit bool) {
for _, hash := range p.pendings.Keys() {
if _, has := alertingKeys[hash]; has {
continue
@@ -223,11 +228,54 @@ func (p *Processor) HandleRecover(alertingKeys map[string]struct{}, now int64) {
p.pendings.Delete(hash)
}
hashArr := make([]string, 0, len(alertingKeys))
for hash := range p.fires.GetAll() {
if _, has := alertingKeys[hash]; has {
continue
}
p.RecoverSingle(hash, now, nil)
hashArr = append(hashArr, hash)
}
p.HandleRecoverEvent(hashArr, now, inhibit)
}
func (p *Processor) HandleRecoverEvent(hashArr []string, now int64, inhibit bool) {
cachedRule := p.rule
if cachedRule == nil {
return
}
if !inhibit {
for _, hash := range hashArr {
p.RecoverSingle(hash, now, nil)
}
return
}
eventMap := make(map[string]models.AlertCurEvent)
for _, hash := range hashArr {
event, has := p.fires.Get(hash)
if !has {
continue
}
e, exists := eventMap[event.Tags]
if !exists {
eventMap[event.Tags] = *event
continue
}
if e.Severity > event.Severity {
// hash 对应的恢复事件的被抑制了,把之前的事件删除
p.fires.Delete(e.Hash)
p.pendings.Delete(e.Hash)
eventMap[event.Tags] = *event
}
}
for _, event := range eventMap {
p.RecoverSingle(event.Hash, now, nil)
}
}
@@ -472,6 +520,11 @@ func (p *Processor) mayHandleGroup() {
}
}
func (p *Processor) DeleteProcessEvent(hash string) {
p.fires.Delete(hash)
p.pendings.Delete(hash)
}
func labelMapToArr(m map[string]string) []string {
numLabels := len(m)

View File

@@ -2,23 +2,24 @@ package sender
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"time"
"github.com/ccfos/nightingale/v6/alert/aconf"
"github.com/ccfos/nightingale/v6/alert/astats"
"github.com/ccfos/nightingale/v6/memsto"
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/ctx"
"github.com/ccfos/nightingale/v6/pkg/ibex"
"github.com/ccfos/nightingale/v6/pkg/poster"
imodels "github.com/flashcatcloud/ibex/src/models"
"github.com/flashcatcloud/ibex/src/storage"
"github.com/toolkits/pkg/logger"
)
func SendCallbacks(ctx *ctx.Context, urls []string, event *models.AlertCurEvent, targetCache *memsto.TargetCacheType, userCache *memsto.UserCacheType,
ibexConf aconf.Ibex, stats *astats.Stats) {
taskTplCache *memsto.TaskTplCache, stats *astats.Stats) {
for _, url := range urls {
if url == "" {
continue
@@ -26,7 +27,7 @@ func SendCallbacks(ctx *ctx.Context, urls []string, event *models.AlertCurEvent,
if strings.HasPrefix(url, "${ibex}") {
if !event.IsRecovered {
handleIbex(ctx, url, event, targetCache, userCache, ibexConf)
handleIbex(ctx, url, event, targetCache, userCache, taskTplCache)
}
continue
}
@@ -46,27 +47,18 @@ func SendCallbacks(ctx *ctx.Context, urls []string, event *models.AlertCurEvent,
}
}
type TaskForm struct {
Title string `json:"title"`
Account string `json:"account"`
Batch int `json:"batch"`
Tolerance int `json:"tolerance"`
Timeout int `json:"timeout"`
Pause string `json:"pause"`
Script string `json:"script"`
Args string `json:"args"`
Stdin string `json:"stdin"`
Action string `json:"action"`
Creator string `json:"creator"`
Hosts []string `json:"hosts"`
}
type TaskCreateReply struct {
Err string `json:"err"`
Dat int64 `json:"dat"` // task.id
}
func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targetCache *memsto.TargetCacheType, userCache *memsto.UserCacheType, ibexConf aconf.Ibex) {
func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targetCache *memsto.TargetCacheType, userCache *memsto.UserCacheType,
taskTplCache *memsto.TaskTplCache) {
if imodels.DB() == nil {
logger.Warning("event_callback_ibex: db is nil")
return
}
arr := strings.Split(url, "/")
var idstr string
@@ -96,12 +88,7 @@ func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targe
return
}
tpl, err := models.TaskTplGetById(ctx, id)
if err != nil {
logger.Errorf("event_callback_ibex: failed to get tpl: %v", err)
return
}
tpl := taskTplCache.Get(id)
if tpl == nil {
logger.Errorf("event_callback_ibex: no such tpl(%d)", id)
return
@@ -109,7 +96,7 @@ func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targe
// check perm
// tpl.GroupId - host - account 三元组校验权限
can, err := canDoIbex(ctx, tpl.UpdateBy, tpl, host, targetCache, userCache)
can, err := canDoIbex(tpl.UpdateBy, tpl, host, targetCache, userCache)
if err != nil {
logger.Errorf("event_callback_ibex: check perm fail: %v", err)
return
@@ -145,61 +132,43 @@ func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targe
}
// call ibex
in := TaskForm{
Title: tpl.Title + " FH: " + host,
Account: tpl.Account,
Batch: tpl.Batch,
Tolerance: tpl.Tolerance,
Timeout: tpl.Timeout,
Pause: tpl.Pause,
Script: tpl.Script,
Args: tpl.Args,
Stdin: string(tags),
Action: "start",
Creator: tpl.UpdateBy,
Hosts: []string{host},
in := models.TaskForm{
Title: tpl.Title + " FH: " + host,
Account: tpl.Account,
Batch: tpl.Batch,
Tolerance: tpl.Tolerance,
Timeout: tpl.Timeout,
Pause: tpl.Pause,
Script: tpl.Script,
Args: tpl.Args,
Stdin: string(tags),
Action: "start",
Creator: tpl.UpdateBy,
Hosts: []string{host},
AlertTriggered: true,
}
var res TaskCreateReply
err = ibex.New(
ibexConf.Address,
ibexConf.BasicAuthUser,
ibexConf.BasicAuthPass,
ibexConf.Timeout,
).
Path("/ibex/v1/tasks").
In(in).
Out(&res).
POST()
id, err = TaskAdd(in, tpl.UpdateBy, ctx.IsCenter)
if err != nil {
logger.Errorf("event_callback_ibex: call ibex fail: %v", err)
return
}
if res.Err != "" {
logger.Errorf("event_callback_ibex: call ibex response error: %v", res.Err)
return
}
// write db
record := models.TaskRecord{
Id: res.Dat,
EventId: event.Id,
GroupId: tpl.GroupId,
IbexAddress: ibexConf.Address,
IbexAuthUser: ibexConf.BasicAuthUser,
IbexAuthPass: ibexConf.BasicAuthPass,
Title: in.Title,
Account: in.Account,
Batch: in.Batch,
Tolerance: in.Tolerance,
Timeout: in.Timeout,
Pause: in.Pause,
Script: in.Script,
Args: in.Args,
CreateAt: time.Now().Unix(),
CreateBy: in.Creator,
Id: id,
EventId: event.Id,
GroupId: tpl.GroupId,
Title: in.Title,
Account: in.Account,
Batch: in.Batch,
Tolerance: in.Tolerance,
Timeout: in.Timeout,
Pause: in.Pause,
Script: in.Script,
Args: in.Args,
CreateAt: time.Now().Unix(),
CreateBy: in.Creator,
}
if err = record.Add(ctx); err != nil {
@@ -207,7 +176,7 @@ func handleIbex(ctx *ctx.Context, url string, event *models.AlertCurEvent, targe
}
}
func canDoIbex(ctx *ctx.Context, username string, tpl *models.TaskTpl, host string, targetCache *memsto.TargetCacheType, userCache *memsto.UserCacheType) (bool, error) {
func canDoIbex(username string, tpl *models.TaskTpl, host string, targetCache *memsto.TargetCacheType, userCache *memsto.UserCacheType) (bool, error) {
user := userCache.GetByUsername(username)
if user != nil && user.IsAdmin() {
return true, nil
@@ -220,3 +189,88 @@ func canDoIbex(ctx *ctx.Context, username string, tpl *models.TaskTpl, host stri
return target.GroupId == tpl.GroupId, nil
}
func TaskAdd(f models.TaskForm, authUser string, isCenter bool) (int64, error) {
hosts := cleanHosts(f.Hosts)
if len(hosts) == 0 {
return 0, fmt.Errorf("arg(hosts) empty")
}
taskMeta := &imodels.TaskMeta{
Title: f.Title,
Account: f.Account,
Batch: f.Batch,
Tolerance: f.Tolerance,
Timeout: f.Timeout,
Pause: f.Pause,
Script: f.Script,
Args: f.Args,
Stdin: f.Stdin,
Creator: f.Creator,
}
err := taskMeta.CleanFields()
if err != nil {
return 0, err
}
taskMeta.HandleFH(hosts[0])
// 任务类型分为"告警规则触发"和"n9e center用户下发"两种;
// 边缘机房"告警规则触发"的任务不需要规划并且它可能是失联的无法使用db资源所以放入redis缓存中直接下发给agentd执行
if !isCenter && f.AlertTriggered {
if err := taskMeta.Create(); err != nil {
// 当网络不连通时生成唯一的id防止边缘机房中不同任务的id相同
// 方法是redis自增id去防止同一个机房的不同n9e edge生成的id相同
// 但没法防止不同边缘机房生成同样的id所以生成id的数据不会上报存入数据库只用于闭环执行。
taskMeta.Id, err = storage.IdGet()
if err != nil {
return 0, err
}
}
taskHost := imodels.TaskHost{
Id: taskMeta.Id,
Host: hosts[0],
Status: "running",
}
if err = taskHost.Create(); err != nil {
logger.Warningf("task_add_fail: authUser=%s title=%s err=%s", authUser, taskMeta.Title, err.Error())
}
// 缓存任务元信息和待下发的任务
err = taskMeta.Cache(hosts[0])
if err != nil {
return 0, err
}
} else {
// 如果是中心机房,还是保持之前的逻辑
err = taskMeta.Save(hosts, f.Action)
if err != nil {
return 0, err
}
}
logger.Infof("task_add_succ: authUser=%s title=%s", authUser, taskMeta.Title)
return taskMeta.Id, nil
}
func cleanHosts(formHosts []string) []string {
cnt := len(formHosts)
arr := make([]string, 0, cnt)
for i := 0; i < cnt; i++ {
item := strings.TrimSpace(formHosts[i])
if item == "" {
continue
}
if strings.HasPrefix(item, "#") {
continue
}
arr = append(arr, item)
}
return arr
}

View File

@@ -86,12 +86,18 @@ func (es *EmailSender) WriteEmail(subject, content string, tos []string) {
func dialSmtp(d *gomail.Dialer) gomail.SendCloser {
for {
if s, err := d.Dial(); err != nil {
logger.Errorf("email_sender: failed to dial smtp: %s", err)
select {
case <-mailQuit:
// Note that Sendcloser is not obtained below,
// and the outgoing signal (with configuration changes) exits the current dial
return nil
default:
if s, err := d.Dial(); err != nil {
logger.Errorf("email_sender: failed to dial smtp: %s", err)
} else {
return s
}
time.Sleep(time.Second)
continue
} else {
return s
}
}
}
@@ -99,8 +105,8 @@ func dialSmtp(d *gomail.Dialer) gomail.SendCloser {
var mailQuit = make(chan struct{})
func RestartEmailSender(smtp aconf.SMTPConfig) {
close(mailQuit)
mailQuit = make(chan struct{})
// Notify internal start exit
mailQuit <- struct{}{}
startEmailSender(smtp)
}
@@ -111,7 +117,6 @@ func InitEmailSender(ncc *memsto.NotifyConfigCacheType) {
go updateSmtp(ncc)
smtpConfig = ncc.GetSMTP()
startEmailSender(smtpConfig)
}
func updateSmtp(ncc *memsto.NotifyConfigCacheType) {
@@ -154,6 +159,12 @@ func startEmailSender(smtp aconf.SMTPConfig) {
if !open {
s = dialSmtp(d)
if s == nil {
// Indicates that the dialing failed and exited the current goroutine directly,
// but put the Message back in the mailch
mailch <- m
return
}
open = true
}
if err := gomail.Send(s, m); err != nil {
@@ -165,6 +176,12 @@ func startEmailSender(smtp aconf.SMTPConfig) {
}
s = dialSmtp(d)
if s == nil {
// Indicates that the dialing failed and exited the current goroutine directly,
// but put the Message back in the mailch
mailch <- m
return
}
open = true
if err := gomail.Send(s, m); err != nil {

View File

@@ -38,7 +38,7 @@ func SendWebhooks(webhooks []*models.Webhook, event *models.AlertCurEvent, stats
if len(conf.Headers) > 0 && len(conf.Headers)%2 == 0 {
for i := 0; i < len(conf.Headers); i += 2 {
if conf.Headers[i] == "host" {
if conf.Headers[i] == "host" || conf.Headers[i] == "Host" {
req.Host = conf.Headers[i+1]
continue
}

View File

@@ -22,8 +22,9 @@ type Plugin struct {
}
type FlashDuty struct {
Api string `json:"api"`
Timeout time.Duration `json:"timeout"`
Api string
Headers map[string]string
Timeout time.Duration
}
type AnonymousAccess struct {

View File

@@ -172,6 +172,14 @@ ops:
- "/busi-groups/put"
- "/busi-groups/del"
- name: builtin-metrics
cname: 指标视图
ops:
- "/metrics-built-in"
- "/builtin-metrics/add"
- "/builtin-metrics/put"
- "/builtin-metrics/del"
- name: system
cname: 系统信息
ops:

View File

@@ -7,10 +7,13 @@ import (
"github.com/ccfos/nightingale/v6/alert"
"github.com/ccfos/nightingale/v6/alert/astats"
"github.com/ccfos/nightingale/v6/alert/process"
alertrt "github.com/ccfos/nightingale/v6/alert/router"
"github.com/ccfos/nightingale/v6/center/cconf"
"github.com/ccfos/nightingale/v6/center/cconf/rsa"
"github.com/ccfos/nightingale/v6/center/cstats"
"github.com/ccfos/nightingale/v6/center/integration"
"github.com/ccfos/nightingale/v6/center/metas"
centerrt "github.com/ccfos/nightingale/v6/center/router"
"github.com/ccfos/nightingale/v6/center/sso"
"github.com/ccfos/nightingale/v6/conf"
"github.com/ccfos/nightingale/v6/dumper"
@@ -25,13 +28,12 @@ import (
"github.com/ccfos/nightingale/v6/pkg/version"
"github.com/ccfos/nightingale/v6/prom"
"github.com/ccfos/nightingale/v6/pushgw/idents"
pushgwrt "github.com/ccfos/nightingale/v6/pushgw/router"
"github.com/ccfos/nightingale/v6/pushgw/writer"
"github.com/ccfos/nightingale/v6/storage"
"github.com/ccfos/nightingale/v6/tdengine"
alertrt "github.com/ccfos/nightingale/v6/alert/router"
centerrt "github.com/ccfos/nightingale/v6/center/router"
pushgwrt "github.com/ccfos/nightingale/v6/pushgw/router"
"github.com/flashcatcloud/ibex/src/cmd/ibex"
)
func Initialize(configDir string, cryptoKey string) (func(), error) {
@@ -67,6 +69,7 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
return nil, err
}
integration.Init(ctx, config.Center.BuiltinIntegrationsDir)
var redis storage.Redis
redis, err = storage.NewRedis(config.Redis)
if err != nil {
@@ -79,8 +82,6 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
syncStats := memsto.NewSyncStats()
alertStats := astats.NewSyncStats()
sso := sso.Init(config.Center, ctx)
configCache := memsto.NewConfigCache(ctx, syncStats, config.HTTP.RSA.RSAPrivateKey, config.HTTP.RSA.RSAPassWord)
busiGroupCache := memsto.NewBusiGroupCache(ctx, syncStats)
targetCache := memsto.NewTargetCache(ctx, syncStats, redis)
@@ -90,12 +91,14 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
notifyConfigCache := memsto.NewNotifyConfigCache(ctx, configCache)
userCache := memsto.NewUserCache(ctx, syncStats)
userGroupCache := memsto.NewUserGroupCache(ctx, syncStats)
taskTplCache := memsto.NewTaskTplCache(ctx)
sso := sso.Init(config.Center, ctx, configCache)
promClients := prom.NewPromClient(ctx)
tdengineClients := tdengine.NewTdengineClient(ctx, config.Alert.Heartbeat)
externalProcessors := process.NewExternalProcessors()
alert.Start(config.Alert, config.Pushgw, syncStats, alertStats, externalProcessors, targetCache, busiGroupCache, alertMuteCache, alertRuleCache, notifyConfigCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
alert.Start(config.Alert, config.Pushgw, syncStats, alertStats, externalProcessors, targetCache, busiGroupCache, alertMuteCache, alertRuleCache, notifyConfigCache, taskTplCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
writers := writer.NewWriters(config.Pushgw)
@@ -113,6 +116,11 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
pushgwRouter.Config(r)
dumper.ConfigRouter(r)
if config.Ibex.Enable {
migrate.MigrateIbexTables(db)
ibex.ServerStart(true, db, redis, config.HTTP.APIForService.BasicAuth, config.Alert.Heartbeat, &config.CenterApi, r, centerRouter, config.Ibex, config.HTTP.Port)
}
httpClean := httpx.Init(config.HTTP, r)
return func() {

228
center/integration/init.go Normal file
View File

@@ -0,0 +1,228 @@
package integration
import (
"encoding/json"
"path"
"strings"
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/ctx"
"github.com/toolkits/pkg/file"
"github.com/toolkits/pkg/ginx"
"github.com/toolkits/pkg/logger"
"github.com/toolkits/pkg/runner"
)
func Init(ctx *ctx.Context, builtinIntegrationsDir string) {
fp := builtinIntegrationsDir
if fp == "" {
fp = path.Join(runner.Cwd, "integrations")
}
// var fileList []string
dirList, err := file.DirsUnder(fp)
ginx.Dangerous(err)
for _, dir := range dirList {
// components icon
componentDir := fp + "/" + dir
component := models.BuiltinComponent{
Ident: dir,
}
// get logo name
// /api/n9e/integrations/icon/AliYun/aliyun.png
files, err := file.FilesUnder(componentDir + "/icon")
if err == nil && len(files) > 0 {
component.Logo = "/api/n9e/integrations/icon/" + component.Ident + "/" + files[0]
} else if err != nil {
logger.Warningf("read builtin component icon dir fail %s %v", component.Ident, err)
}
// get description
files, err = file.FilesUnder(componentDir + "/markdown")
if err == nil && len(files) > 0 {
var readmeFile string
for _, file := range files {
if strings.HasSuffix(strings.ToLower(file), "md") {
readmeFile = file
}
}
if readmeFile != "" {
component.Readme, _ = file.ReadString(readmeFile)
}
} else if err != nil {
logger.Warningf("read builtin component markdown dir fail %s %v", component.Ident, err)
}
exists, _ := models.BuiltinComponentExists(ctx, &component)
if !exists {
err = component.Add(ctx, "system")
if err != nil {
logger.Warning("add builtin component fail ", component, err)
continue
}
}
// alerts
files, err = file.FilesUnder(componentDir + "/alerts")
if err == nil && len(files) > 0 {
for _, f := range files {
fp := componentDir + "/alerts/" + f
bs, err := file.ReadBytes(fp)
if err != nil {
logger.Warning("read builtin component alerts file fail ", f, err)
continue
}
alerts := []models.AlertRule{}
err = json.Unmarshal(bs, &alerts)
if err != nil {
logger.Warning("parse builtin component alerts file fail ", f, err)
continue
}
for _, alert := range alerts {
content, err := json.Marshal(alert)
if err != nil {
logger.Warning("marshal builtin alert fail ", alert, err)
continue
}
cate := strings.Replace(f, ".json", "", -1)
builtinAlert := models.BuiltinPayload{
Component: component.Ident,
Type: "alert",
Cate: cate,
Name: alert.Name,
Content: string(content),
}
exists, err := models.BuiltinPayloadExists(ctx, &builtinAlert)
if err != nil {
logger.Warning("check builtin alert exists fail ", builtinAlert, err)
continue
}
if exists {
continue
}
err = builtinAlert.Add(ctx, "system")
if err != nil {
logger.Warningf("add builtin alert:%+v fail %v", builtinAlert, err)
continue
}
}
}
}
// dashboards
files, err = file.FilesUnder(componentDir + "/dashboards")
if err == nil && len(files) > 0 {
for _, f := range files {
fp := componentDir + "/dashboards/" + f
bs, err := file.ReadBytes(fp)
if err != nil {
logger.Warning("read builtin component dashboards file fail ", f, err)
continue
}
dashboard := BuiltinBoard{}
err = json.Unmarshal(bs, &dashboard)
if err != nil {
logger.Warning("parse builtin component dashboards file fail ", f, err)
continue
}
content, err := json.Marshal(dashboard)
if err != nil {
logger.Warning("marshal builtin dashboard fail ", dashboard, err)
continue
}
builtinDashboard := models.BuiltinPayload{
Component: component.Ident,
Type: "dashboard",
Cate: "",
Name: dashboard.Name,
Content: string(content),
}
exists, err := models.BuiltinPayloadExists(ctx, &builtinDashboard)
if err != nil {
logger.Warning("check builtin dashboard exists fail ", builtinDashboard, err)
continue
}
if exists {
continue
}
err = builtinDashboard.Add(ctx, "system")
if err != nil {
logger.Warning("add builtin dashboard fail ", builtinDashboard, err)
continue
}
}
} else if err != nil {
logger.Warningf("read builtin component dash dir fail %s %v", component.Ident, err)
}
// metrics
files, err = file.FilesUnder(componentDir + "/metrics")
if err == nil && len(files) > 0 {
for _, f := range files {
fp := componentDir + "/metrics/" + f
bs, err := file.ReadBytes(fp)
if err != nil {
logger.Warning("read builtin component metrics file fail", f, err)
continue
}
metrics := []models.BuiltinMetric{}
err = json.Unmarshal(bs, &metrics)
if err != nil {
logger.Warning("parse builtin component metrics file fail", f, err)
continue
}
for _, metric := range metrics {
exists, err := models.BuiltinMetricExists(ctx, &metric)
if err != nil {
logger.Warning("check builtin metric exists fail", metric, err)
continue
}
if exists {
continue
}
err = metric.Add(ctx, "system")
if err != nil {
logger.Warning("add builtin metric fail", metric, err)
continue
}
}
}
} else if err != nil {
logger.Warningf("read builtin component metrics dir fail %s %v", component.Ident, err)
}
}
}
type BuiltinBoard struct {
Id int64 `json:"id" gorm:"primaryKey"`
GroupId int64 `json:"group_id"`
Name string `json:"name"`
Ident string `json:"ident"`
Tags string `json:"tags"`
CreateAt int64 `json:"create_at"`
CreateBy string `json:"create_by"`
UpdateAt int64 `json:"update_at"`
UpdateBy string `json:"update_by"`
Configs interface{} `json:"configs" gorm:"-"`
Public int `json:"public"` // 0: false, 1: true
PublicCate int `json:"public_cate"` // 0: anonymous, 1: login, 2: busi
Bgids []int64 `json:"bgids" gorm:"-"`
BuiltIn int `json:"built_in"` // 0: false, 1: true
Hide int `json:"hide"` // 0: false, 1: true
}

View File

@@ -92,14 +92,14 @@ func languageDetector(i18NHeaderKey string) gin.HandlerFunc {
lang := c.GetHeader(headerKey)
if lang != "" {
if strings.HasPrefix(lang, "zh") {
c.Request.Header.Set("X-Language", "zh")
c.Request.Header.Set("X-Language", "zh_CN")
} else if strings.HasPrefix(lang, "en") {
c.Request.Header.Set("X-Language", "en")
} else {
c.Request.Header.Set("X-Language", lang)
}
} else {
c.Request.Header.Set("X-Language", "en")
c.Request.Header.Set("X-Language", "zh_CN")
}
}
c.Next()
@@ -229,6 +229,20 @@ func (rt *Router) Config(r *gin.Engine) {
pages.POST("/metric-views", rt.auth(), rt.user(), rt.metricViewAdd)
pages.PUT("/metric-views", rt.auth(), rt.user(), rt.metricViewPut)
pages.GET("/builtin-metric-filters", rt.auth(), rt.user(), rt.metricFilterGets)
pages.DELETE("/builtin-metric-filters", rt.auth(), rt.user(), rt.metricFilterDel)
pages.POST("/builtin-metric-filters", rt.auth(), rt.user(), rt.metricFilterAdd)
pages.PUT("/builtin-metric-filters", rt.auth(), rt.user(), rt.metricFilterPut)
pages.POST("/builtin-metric-promql", rt.auth(), rt.user(), rt.getMetricPromql)
pages.POST("/builtin-metrics", rt.auth(), rt.user(), rt.perm("/builtin-metrics/add"), rt.builtinMetricsAdd)
pages.PUT("/builtin-metrics", rt.auth(), rt.user(), rt.perm("/builtin-metrics/put"), rt.builtinMetricsPut)
pages.DELETE("/builtin-metrics", rt.auth(), rt.user(), rt.perm("/builtin-metrics/del"), rt.builtinMetricsDel)
pages.GET("/builtin-metrics", rt.auth(), rt.user(), rt.builtinMetricsGets)
pages.GET("/builtin-metrics/types", rt.auth(), rt.user(), rt.builtinMetricsTypes)
pages.GET("/builtin-metrics/types/default", rt.auth(), rt.user(), rt.builtinMetricsDefaultTypes)
pages.GET("/builtin-metrics/collectors", rt.auth(), rt.user(), rt.builtinMetricsCollectors)
pages.GET("/user-groups", rt.auth(), rt.user(), rt.userGroupGets)
pages.POST("/user-groups", rt.auth(), rt.user(), rt.perm("/user-groups/add"), rt.userGroupAdd)
pages.GET("/user-group/:id", rt.auth(), rt.user(), rt.userGroupGet)
@@ -273,7 +287,7 @@ func (rt *Router) Config(r *gin.Engine) {
pages.GET("/busi-group/:id/boards", rt.auth(), rt.user(), rt.perm("/dashboards"), rt.bgro(), rt.boardGets)
pages.POST("/busi-group/:id/boards", rt.auth(), rt.user(), rt.perm("/dashboards/add"), rt.bgrw(), rt.boardAdd)
pages.POST("/busi-group/:id/board/:bid/clone", rt.auth(), rt.user(), rt.perm("/dashboards/add"), rt.bgrw(), rt.boardClone)
pages.POST("/busi-group/:id/boards/clones", rt.auth(), rt.user(), rt.perm("/dashboards/add"), rt.boardBatchClone)
pages.POST("/busi-groups/boards/clones", rt.auth(), rt.user(), rt.perm("/dashboards/add"), rt.boardBatchClone)
pages.GET("/board/:bid", rt.boardGet)
pages.GET("/board/:bid/pure", rt.boardPureGet)
@@ -356,11 +370,9 @@ func (rt *Router) Config(r *gin.Engine) {
pages.GET("/busi-groups/tasks", rt.auth(), rt.user(), rt.perm("/job-tasks"), rt.taskGetsByGids)
pages.GET("/busi-group/:id/tasks", rt.auth(), rt.user(), rt.perm("/job-tasks"), rt.bgro(), rt.taskGets)
pages.POST("/busi-group/:id/tasks", rt.auth(), rt.user(), rt.perm("/job-tasks/add"), rt.bgrw(), rt.taskAdd)
pages.GET("/busi-group/:id/task/*url", rt.auth(), rt.user(), rt.perm("/job-tasks"), rt.taskProxy)
pages.PUT("/busi-group/:id/task/*url", rt.auth(), rt.user(), rt.perm("/job-tasks/put"), rt.bgrw(), rt.taskProxy)
pages.GET("/servers", rt.auth(), rt.admin(), rt.serversGet)
pages.GET("/server-clusters", rt.auth(), rt.admin(), rt.serverClustersGet)
pages.GET("/servers", rt.auth(), rt.user(), rt.perm("/help/servers"), rt.serversGet)
pages.GET("/server-clusters", rt.auth(), rt.user(), rt.perm("/help/servers"), rt.serverClustersGet)
pages.POST("/datasource/list", rt.auth(), rt.user(), rt.datasourceList)
pages.POST("/datasource/plugin/list", rt.auth(), rt.pluginList)
@@ -422,6 +434,16 @@ func (rt *Router) Config(r *gin.Engine) {
// for admin api
pages.GET("/user/busi-groups", rt.auth(), rt.admin(), rt.userBusiGroupsGets)
pages.POST("/builtin-components", rt.auth(), rt.user(), rt.perm("/builtin-components/add"), rt.builtinComponentsAdd)
pages.GET("/builtin-components", rt.auth(), rt.user(), rt.perm("/builtin-components"), rt.builtinComponentsGets)
pages.PUT("/builtin-components", rt.auth(), rt.user(), rt.perm("/builtin-components/put"), rt.builtinComponentsPut)
pages.DELETE("/builtin-components", rt.auth(), rt.user(), rt.perm("/builtin-components/del"), rt.builtinComponentsDel)
pages.POST("/builtin-payloads", rt.auth(), rt.user(), rt.perm("/builtin-payloads/add"), rt.builtinPayloadsAdd)
pages.GET("/builtin-payloads", rt.auth(), rt.user(), rt.perm("/builtin-payloads"), rt.builtinPayloadsGets)
pages.GET("/builtin-payload/:id", rt.auth(), rt.user(), rt.perm("/builtin-payloads"), rt.builtinPayloadGet)
pages.PUT("/builtin-payloads", rt.auth(), rt.user(), rt.perm("/builtin-payloads/put"), rt.builtinPayloadsPut)
pages.DELETE("/builtin-payloads", rt.auth(), rt.user(), rt.perm("/builtin-payloads/del"), rt.builtinPayloadsDel)
}
r.GET("/api/n9e/versions", func(c *gin.Context) {
@@ -488,6 +510,8 @@ func (rt *Router) Config(r *gin.Engine) {
service.GET("/alert-his-event/:eid", rt.alertHisEventGet)
service.GET("/task-tpl/:tid", rt.taskTplGetByService)
service.GET("/task-tpls", rt.taskTplGetsByService)
service.GET("/task-tpl/statistics", rt.taskTplStatistics)
service.GET("/config/:id", rt.configGet)
service.GET("/configs", rt.configsGet)

View File

@@ -40,6 +40,11 @@ func (rt *Router) alertRuleGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}

View File

@@ -42,6 +42,11 @@ func (rt *Router) alertSubscribeGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}

View File

@@ -1,6 +1,7 @@
package router
import (
"fmt"
"net/http"
"time"
@@ -269,6 +270,11 @@ func (rt *Router) boardGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}
@@ -294,7 +300,7 @@ func (rt *Router) boardClone(c *gin.Context) {
me := c.MustGet("user").(*models.User)
bo := rt.Board(ginx.UrlParamInt64(c, "bid"))
newBoard := bo.Clone(me.Username, bo.GroupId)
newBoard := bo.Clone(me.Username, bo.GroupId, " Cloned")
ginx.Dangerous(newBoard.Add(rt.Ctx))
@@ -311,32 +317,34 @@ func (rt *Router) boardClone(c *gin.Context) {
type boardsForm struct {
BoardIds []int64 `json:"board_ids"`
Bgids []int64 `json:"bgids"`
}
func (rt *Router) boardBatchClone(c *gin.Context) {
me := c.MustGet("user").(*models.User)
bgid := ginx.UrlParamInt64(c, "id")
rt.bgrwCheck(c, bgid)
var f boardsForm
ginx.BindJSON(c, &f)
for _, bgid := range f.Bgids {
rt.bgrwCheck(c, bgid)
}
reterr := make(map[string]string, len(f.BoardIds))
lang := c.GetHeader("X-Language")
for _, bid := range f.BoardIds {
bo := rt.Board(bid)
newBoard := bo.Clone(me.Username, bgid)
payload, err := models.BoardPayloadGet(rt.Ctx, bo.Id)
if err != nil {
reterr[newBoard.Name] = i18n.Sprintf(lang, err.Error())
continue
}
for _, bgid := range f.Bgids {
for _, bid := range f.BoardIds {
bo := rt.Board(bid)
newBoard := bo.Clone(me.Username, bgid, "")
payload, err := models.BoardPayloadGet(rt.Ctx, bo.Id)
if err != nil {
reterr[fmt.Sprintf("%s-%d", newBoard.Name, bgid)] = i18n.Sprintf(lang, err.Error())
continue
}
if err = newBoard.AtomicAdd(rt.Ctx, payload); err != nil {
reterr[newBoard.Name] = i18n.Sprintf(lang, err.Error())
} else {
reterr[newBoard.Name] = ""
if err = newBoard.AtomicAdd(rt.Ctx, payload); err != nil {
reterr[fmt.Sprintf("%s-%d", newBoard.Name, bgid)] = i18n.Sprintf(lang, err.Error())
}
}
}

View File

@@ -0,0 +1,66 @@
package router
import (
"net/http"
"github.com/ccfos/nightingale/v6/models"
"github.com/gin-gonic/gin"
"github.com/toolkits/pkg/ginx"
)
func (rt *Router) builtinComponentsAdd(c *gin.Context) {
var lst []models.BuiltinComponent
ginx.BindJSON(c, &lst)
username := Username(c)
count := len(lst)
if count == 0 {
ginx.Bomb(http.StatusBadRequest, "input json is empty")
}
reterr := make(map[string]string)
for i := 0; i < count; i++ {
if err := lst[i].Add(rt.Ctx, username); err != nil {
reterr[lst[i].Ident] = err.Error()
}
}
ginx.NewRender(c).Data(reterr, nil)
}
func (rt *Router) builtinComponentsGets(c *gin.Context) {
query := ginx.QueryStr(c, "query", "")
bc, err := models.BuiltinComponentGets(rt.Ctx, query)
ginx.Dangerous(err)
ginx.NewRender(c).Data(bc, nil)
}
func (rt *Router) builtinComponentsPut(c *gin.Context) {
var req models.BuiltinComponent
ginx.BindJSON(c, &req)
bc, err := models.BuiltinComponentGet(rt.Ctx, "id = ?", req.ID)
ginx.Dangerous(err)
if bc == nil {
ginx.NewRender(c, http.StatusNotFound).Message("No such builtin component")
return
}
username := Username(c)
req.UpdatedBy = username
ginx.NewRender(c).Message(bc.Update(rt.Ctx, req))
}
func (rt *Router) builtinComponentsDel(c *gin.Context) {
var req idsForm
ginx.BindJSON(c, &req)
req.Verify()
ginx.NewRender(c).Message(models.BuiltinComponentDels(rt.Ctx, req.Ids))
}

View File

@@ -0,0 +1,120 @@
package router
import (
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/prom"
"github.com/gin-gonic/gin"
"github.com/toolkits/pkg/ginx"
)
func (rt *Router) metricFilterGets(c *gin.Context) {
lst, err := models.MetricFilterGets(rt.Ctx, "")
ginx.Dangerous(err)
me := c.MustGet("user").(*models.User)
gids, err := models.MyGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
arr := make([]models.MetricFilter, 0)
for _, f := range lst {
if me.Username == f.CreateBy {
arr = append(arr, f)
continue
}
if HasPerm(gids, f.GroupsPerm, false) {
arr = append(arr, f)
}
}
ginx.NewRender(c).Data(arr, err)
}
func (rt *Router) metricFilterAdd(c *gin.Context) {
var f models.MetricFilter
ginx.BindJSON(c, &f)
me := c.MustGet("user").(*models.User)
f.CreateBy = me.Username
f.UpdateBy = me.Username
ginx.Dangerous(f.Add(rt.Ctx))
ginx.NewRender(c).Data(f, nil)
}
func (rt *Router) metricFilterDel(c *gin.Context) {
var f idsForm
ginx.BindJSON(c, &f)
f.Verify()
me := c.MustGet("user").(*models.User)
for _, id := range f.Ids {
old, err := models.MetricFilterGet(rt.Ctx, id)
ginx.Dangerous(err)
if me.Username != old.CreateBy {
gids, err := models.MyGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if !HasPerm(gids, old.GroupsPerm, true) {
ginx.NewRender(c).Message("no permission")
return
}
}
}
ginx.NewRender(c).Message(models.MetricFilterDel(rt.Ctx, f.Ids))
}
func (rt *Router) metricFilterPut(c *gin.Context) {
var f models.MetricFilter
ginx.BindJSON(c, &f)
me := c.MustGet("user").(*models.User)
old, err := models.MetricFilterGet(rt.Ctx, f.ID)
ginx.Dangerous(err)
if me.Username != old.CreateBy {
gids, err := models.MyGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if !HasPerm(gids, old.GroupsPerm, true) {
ginx.NewRender(c).Message("no permission")
return
}
}
f.UpdateBy = me.Username
ginx.NewRender(c).Message(f.Update(rt.Ctx))
}
type metricPromqlReq struct {
LabelFilter string `json:"label_filter"`
Promql string `json:"promql"`
}
func (rt *Router) getMetricPromql(c *gin.Context) {
var req metricPromqlReq
ginx.BindJSON(c, &req)
promql := prom.AddLabelToPromQL(req.LabelFilter, req.Promql)
ginx.NewRender(c).Data(promql, nil)
}
func HasPerm(gids []int64, gps []models.GroupPerm, checkWrite bool) bool {
gmap := make(map[int64]struct{})
for _, gp := range gps {
if checkWrite && !gp.Write {
continue
}
gmap[gp.Gid] = struct{}{}
}
for _, gid := range gids {
if _, ok := gmap[gid]; ok {
return true
}
}
return false
}

View File

@@ -0,0 +1,113 @@
package router
import (
"net/http"
"github.com/ccfos/nightingale/v6/models"
"github.com/gin-gonic/gin"
"github.com/toolkits/pkg/ginx"
)
// single or import
func (rt *Router) builtinMetricsAdd(c *gin.Context) {
var lst []models.BuiltinMetric
ginx.BindJSON(c, &lst)
username := Username(c)
count := len(lst)
if count == 0 {
ginx.Bomb(http.StatusBadRequest, "input json is empty")
}
lang := c.GetHeader("X-Language")
if lang == "" {
lang = "zh_CN"
}
reterr := make(map[string]string)
for i := 0; i < count; i++ {
lst[i].Lang = lang
if err := lst[i].Add(rt.Ctx, username); err != nil {
reterr[lst[i].Name] = err.Error()
}
}
ginx.NewRender(c).Data(reterr, nil)
}
func (rt *Router) builtinMetricsGets(c *gin.Context) {
collector := ginx.QueryStr(c, "collector", "")
typ := ginx.QueryStr(c, "typ", "")
query := ginx.QueryStr(c, "query", "")
limit := ginx.QueryInt(c, "limit", 20)
lang := c.GetHeader("X-Language")
unit := ginx.QueryStr(c, "unit", "")
if lang == "" {
lang = "zh_CN"
}
bm, err := models.BuiltinMetricGets(rt.Ctx, lang, collector, typ, query, unit, limit, ginx.Offset(c, limit))
ginx.Dangerous(err)
total, err := models.BuiltinMetricCount(rt.Ctx, lang, collector, typ, query, unit)
ginx.Dangerous(err)
ginx.NewRender(c).Data(gin.H{
"list": bm,
"total": total,
}, nil)
}
func (rt *Router) builtinMetricsPut(c *gin.Context) {
var req models.BuiltinMetric
ginx.BindJSON(c, &req)
bm, err := models.BuiltinMetricGet(rt.Ctx, "id = ?", req.ID)
ginx.Dangerous(err)
if bm == nil {
ginx.NewRender(c, http.StatusNotFound).Message("No such builtin metric")
return
}
username := Username(c)
req.UpdatedBy = username
ginx.NewRender(c).Message(bm.Update(rt.Ctx, req))
}
func (rt *Router) builtinMetricsDel(c *gin.Context) {
var req idsForm
ginx.BindJSON(c, &req)
req.Verify()
ginx.NewRender(c).Message(models.BuiltinMetricDels(rt.Ctx, req.Ids))
}
func (rt *Router) builtinMetricsDefaultTypes(c *gin.Context) {
lst := []string{
"Linux",
"cAdvisor",
"Ping",
"MySQL",
"Redis",
"Kafka",
"Elasticsearch",
"PostgreSQL",
"MongoDB",
"Memcached",
}
ginx.NewRender(c).Data(lst, nil)
}
func (rt *Router) builtinMetricsTypes(c *gin.Context) {
collector := ginx.QueryStr(c, "collector", "")
query := ginx.QueryStr(c, "query", "")
lang := c.GetHeader("X-Language")
ginx.NewRender(c).Data(models.BuiltinMetricTypes(rt.Ctx, lang, collector, query))
}
func (rt *Router) builtinMetricsCollectors(c *gin.Context) {
typ := ginx.QueryStr(c, "typ", "")
query := ginx.QueryStr(c, "query", "")
lang := c.GetHeader("X-Language")
ginx.NewRender(c).Data(models.BuiltinMetricCollectors(rt.Ctx, lang, typ, query))
}

View File

@@ -0,0 +1,91 @@
package router
import (
"net/http"
"github.com/ccfos/nightingale/v6/models"
"github.com/gin-gonic/gin"
"github.com/toolkits/pkg/ginx"
)
func (rt *Router) builtinPayloadsAdd(c *gin.Context) {
var lst []models.BuiltinPayload
ginx.BindJSON(c, &lst)
username := Username(c)
count := len(lst)
if count == 0 {
ginx.Bomb(http.StatusBadRequest, "input json is empty")
}
reterr := make(map[string]string)
for i := 0; i < count; i++ {
if err := lst[i].Add(rt.Ctx, username); err != nil {
reterr[lst[i].Name] = err.Error()
}
}
ginx.NewRender(c).Data(reterr, nil)
}
func (rt *Router) builtinPayloadsGets(c *gin.Context) {
typ := ginx.QueryStr(c, "type", "")
component := ginx.QueryStr(c, "component", "")
cate := ginx.QueryStr(c, "cate", "")
name := ginx.QueryStr(c, "name", "")
limit := ginx.QueryInt(c, "limit", 20)
lst, err := models.BuiltinPayloadGets(rt.Ctx, typ, component, cate, name, limit, ginx.Offset(c, limit))
ginx.Dangerous(err)
m := make(map[string][]*models.BuiltinPayload)
for _, v := range lst {
if _, ok := m[v.Cate]; !ok {
m[v.Cate] = make([]*models.BuiltinPayload, 0)
}
m[v.Cate] = append(m[v.Cate], v)
}
ginx.NewRender(c).Data(m, nil)
}
func (rt *Router) builtinPayloadGet(c *gin.Context) {
id := ginx.UrlParamInt64(c, "id")
bp, err := models.BuiltinPayloadGet(rt.Ctx, "id = ?", id)
if err != nil {
ginx.Bomb(http.StatusInternalServerError, err.Error())
}
if bp == nil {
ginx.Bomb(http.StatusNotFound, "builtin payload not found")
}
ginx.NewRender(c).Data(bp, nil)
}
func (rt *Router) builtinPayloadsPut(c *gin.Context) {
var req models.BuiltinPayload
ginx.BindJSON(c, &req)
bp, err := models.BuiltinPayloadGet(rt.Ctx, "id = ?", req.ID)
ginx.Dangerous(err)
if bp == nil {
ginx.NewRender(c, http.StatusNotFound).Message("No such builtin payload")
return
}
username := Username(c)
req.UpdatedBy = username
ginx.NewRender(c).Message(bp.Update(rt.Ctx, req))
}
func (rt *Router) builtinPayloadsDel(c *gin.Context) {
var req idsForm
ginx.BindJSON(c, &req)
req.Verify()
ginx.NewRender(c).Message(models.BuiltinPayloadDels(rt.Ctx, req.Ids))
}

View File

@@ -1,17 +1,14 @@
package router
import (
"fmt"
"net/http"
"strconv"
"strings"
"github.com/ccfos/nightingale/v6/alert/aconf"
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/ctx"
"github.com/ccfos/nightingale/v6/pkg/ibex"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin"
"github.com/toolkits/pkg/ginx"
)
@@ -135,31 +132,6 @@ type TaskCreateReply struct {
Dat int64 `json:"dat"` // task.id
}
// return task.id, error
func TaskCreate(v interface{}, ibexc aconf.Ibex) (int64, error) {
var res TaskCreateReply
err := ibex.New(
ibexc.Address,
ibexc.BasicAuthUser,
ibexc.BasicAuthPass,
ibexc.Timeout,
).
Path("/ibex/v1/tasks").
In(v).
Out(&res).
POST()
if err != nil {
return 0, err
}
if res.Err != "" {
return 0, fmt.Errorf("response.err: %v", res.Err)
}
return res.Dat, nil
}
func Username(c *gin.Context) string {
username := c.GetString(gin.AuthUserKey)
if username == "" {

View File

@@ -92,7 +92,7 @@ func (rt *Router) loginPost(c *gin.Context) {
}
func (rt *Router) logoutPost(c *gin.Context) {
logger.Infof("username:%s login from:%s", c.GetString("username"), c.ClientIP())
logger.Infof("username:%s logout from:%s", c.GetString("username"), c.ClientIP())
metadata, err := rt.extractTokenMetadata(c.Request)
if err != nil {
ginx.NewRender(c, http.StatusBadRequest).Message("failed to parse jwt token")

View File

@@ -33,6 +33,11 @@ func (rt *Router) alertMuteGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}
@@ -101,7 +106,7 @@ func (rt *Router) alertMuteDel(c *gin.Context) {
ginx.NewRender(c).Message(models.AlertMuteDel(rt.Ctx, f.Ids))
}
// alertMuteGetById returns the alert mute by ID
// alertMuteGet returns the alert mute by ID
func (rt *Router) alertMuteGet(c *gin.Context) {
amid := ginx.UrlParamInt64(c, "amid")
am, err := models.AlertMuteGetById(rt.Ctx, amid)

View File

@@ -92,6 +92,10 @@ func (rt *Router) jwtAuth() gin.HandlerFunc {
}
}
func (rt *Router) Auth() gin.HandlerFunc {
return rt.auth()
}
func (rt *Router) auth() gin.HandlerFunc {
if rt.HTTP.ProxyAuth.Enable {
return rt.proxyAuth()
@@ -120,6 +124,10 @@ func (rt *Router) jwtMock() gin.HandlerFunc {
}
}
func (rt *Router) User() gin.HandlerFunc {
return rt.user()
}
func (rt *Router) user() gin.HandlerFunc {
return func(c *gin.Context) {
userid := c.MustGet("userid").(int64)
@@ -174,6 +182,10 @@ func (rt *Router) bgro() gin.HandlerFunc {
}
// bgrw 逐步要被干掉,不安全
func (rt *Router) Bgrw() gin.HandlerFunc {
return rt.bgrw()
}
func (rt *Router) bgrw() gin.HandlerFunc {
return func(c *gin.Context) {
me := c.MustGet("user").(*models.User)
@@ -233,6 +245,10 @@ func (rt *Router) bgroCheck(c *gin.Context, bgid int64) {
c.Set("busi_group", bg)
}
func (rt *Router) Perm(operation string) gin.HandlerFunc {
return rt.perm(operation)
}
func (rt *Router) perm(operation string) gin.HandlerFunc {
return func(c *gin.Context) {
me := c.MustGet("user").(*models.User)

View File

@@ -169,10 +169,6 @@ func (rt *Router) notifyConfigPut(c *gin.Context) {
var smtp aconf.SMTPConfig
err := toml.Unmarshal([]byte(text), &smtp)
ginx.Dangerous(err)
case models.IBEX:
var ibex aconf.Ibex
err := toml.Unmarshal([]byte(f.Cval), &ibex)
ginx.Dangerous(err)
default:
ginx.Bomb(200, "key %s can not modify", f.Ckey)
}

View File

@@ -32,6 +32,11 @@ func (rt *Router) recordingRuleGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}

View File

@@ -2,6 +2,7 @@ package router
import (
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/flashduty"
"github.com/ccfos/nightingale/v6/pkg/ormx"
"github.com/gin-gonic/gin"
@@ -29,6 +30,11 @@ func (rt *Router) selfProfilePut(c *gin.Context) {
ginx.BindJSON(c, &f)
user := c.MustGet("user").(*models.User)
oldInfo := models.User{
Username: user.Username,
Phone: user.Phone,
Email: user.Email,
}
user.Nickname = f.Nickname
user.Phone = f.Phone
user.Email = f.Email
@@ -36,6 +42,10 @@ func (rt *Router) selfProfilePut(c *gin.Context) {
user.Contacts = f.Contacts
user.UpdateBy = user.Username
if flashduty.NeedSyncUser(rt.Ctx) {
flashduty.UpdateUser(rt.Ctx, oldInfo, f.Email, f.Phone)
}
ginx.NewRender(c).Message(user.UpdateAllFields(rt.Ctx))
}

View File

@@ -1,13 +1,10 @@
package router
import (
"fmt"
"net/http"
"net/http/httputil"
"net/url"
"strings"
"time"
"github.com/ccfos/nightingale/v6/alert/sender"
"github.com/ccfos/nightingale/v6/models"
"github.com/gin-gonic/gin"
@@ -54,6 +51,11 @@ func (rt *Router) taskGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}
@@ -96,71 +98,6 @@ type taskForm struct {
Hosts []string `json:"hosts" binding:"required"`
}
func (f *taskForm) Verify() error {
if f.Batch < 0 {
return fmt.Errorf("arg(batch) should be nonnegative")
}
if f.Tolerance < 0 {
return fmt.Errorf("arg(tolerance) should be nonnegative")
}
if f.Timeout < 0 {
return fmt.Errorf("arg(timeout) should be nonnegative")
}
if f.Timeout > 3600*24 {
return fmt.Errorf("arg(timeout) longer than one day")
}
if f.Timeout == 0 {
f.Timeout = 30
}
f.Pause = strings.Replace(f.Pause, "", ",", -1)
f.Pause = strings.Replace(f.Pause, " ", "", -1)
f.Args = strings.Replace(f.Args, "", ",", -1)
if f.Title == "" {
return fmt.Errorf("arg(title) is required")
}
if str.Dangerous(f.Title) {
return fmt.Errorf("arg(title) is dangerous")
}
if f.Script == "" {
return fmt.Errorf("arg(script) is required")
}
f.Script = strings.Replace(f.Script, "\r\n", "\n", -1)
if str.Dangerous(f.Args) {
return fmt.Errorf("arg(args) is dangerous")
}
if str.Dangerous(f.Pause) {
return fmt.Errorf("arg(pause) is dangerous")
}
if len(f.Hosts) == 0 {
return fmt.Errorf("arg(hosts) empty")
}
if f.Action != "start" && f.Action != "pause" {
return fmt.Errorf("arg(action) invalid")
}
return nil
}
func (f *taskForm) HandleFH(fh string) {
i := strings.Index(f.Title, " FH: ")
if i > 0 {
f.Title = f.Title[:i]
}
f.Title = f.Title + " FH: " + fh
}
func (rt *Router) taskRecordAdd(c *gin.Context) {
var f *models.TaskRecord
ginx.BindJSON(c, &f)
@@ -168,7 +105,7 @@ func (rt *Router) taskRecordAdd(c *gin.Context) {
}
func (rt *Router) taskAdd(c *gin.Context) {
var f taskForm
var f models.TaskForm
ginx.BindJSON(c, &f)
bgid := ginx.UrlParamInt64(c, "id")
@@ -184,7 +121,7 @@ func (rt *Router) taskAdd(c *gin.Context) {
rt.checkTargetPerm(c, f.Hosts)
// call ibex
taskId, err := TaskCreate(f, rt.NotifyConfigCache.GetIbex())
taskId, err := sender.TaskAdd(f, user.Username, rt.Ctx.IsCenter)
ginx.Dangerous(err)
if taskId <= 0 {
@@ -193,65 +130,20 @@ func (rt *Router) taskAdd(c *gin.Context) {
// write db
record := models.TaskRecord{
Id: taskId,
GroupId: bgid,
IbexAddress: rt.NotifyConfigCache.GetIbex().Address,
IbexAuthUser: rt.NotifyConfigCache.GetIbex().BasicAuthUser,
IbexAuthPass: rt.NotifyConfigCache.GetIbex().BasicAuthPass,
Title: f.Title,
Account: f.Account,
Batch: f.Batch,
Tolerance: f.Tolerance,
Timeout: f.Timeout,
Pause: f.Pause,
Script: f.Script,
Args: f.Args,
CreateAt: time.Now().Unix(),
CreateBy: f.Creator,
Id: taskId,
GroupId: bgid,
Title: f.Title,
Account: f.Account,
Batch: f.Batch,
Tolerance: f.Tolerance,
Timeout: f.Timeout,
Pause: f.Pause,
Script: f.Script,
Args: f.Args,
CreateAt: time.Now().Unix(),
CreateBy: f.Creator,
}
err = record.Add(rt.Ctx)
ginx.NewRender(c).Data(taskId, err)
}
func (rt *Router) taskProxy(c *gin.Context) {
target, err := url.Parse(rt.NotifyConfigCache.GetIbex().Address)
if err != nil {
ginx.NewRender(c).Message("invalid ibex address: %s", rt.NotifyConfigCache.GetIbex().Address)
return
}
director := func(req *http.Request) {
req.URL.Scheme = target.Scheme
req.URL.Host = target.Host
// fe request e.g. /api/n9e/busi-group/:id/task/*url
index := strings.Index(req.URL.Path, "/task/")
if index == -1 {
panic("url path invalid")
}
req.URL.Path = "/ibex/v1" + req.URL.Path[index:]
if target.RawQuery == "" || req.URL.RawQuery == "" {
req.URL.RawQuery = target.RawQuery + req.URL.RawQuery
} else {
req.URL.RawQuery = target.RawQuery + "&" + req.URL.RawQuery
}
if rt.NotifyConfigCache.GetIbex().BasicAuthUser != "" {
req.SetBasicAuth(rt.NotifyConfigCache.GetIbex().BasicAuthUser, rt.NotifyConfigCache.GetIbex().BasicAuthPass)
}
}
errFunc := func(w http.ResponseWriter, r *http.Request, err error) {
ginx.NewRender(c, http.StatusBadGateway).Message(err)
}
proxy := &httputil.ReverseProxy{
Director: director,
ErrorHandler: errFunc,
}
proxy.ServeHTTP(c.Writer, c.Request)
}

View File

@@ -45,6 +45,11 @@ func (rt *Router) taskTplGetsByGids(c *gin.Context) {
var err error
gids, err = models.MyBusiGroupIds(rt.Ctx, me.Id)
ginx.Dangerous(err)
if len(gids) == 0 {
ginx.Bomb(http.StatusForbidden, "forbidden")
return
}
}
}
@@ -91,6 +96,14 @@ func (rt *Router) taskTplGetByService(c *gin.Context) {
ginx.NewRender(c).Data(tpl, err)
}
func (rt *Router) taskTplGetsByService(c *gin.Context) {
ginx.NewRender(c).Data(models.TaskTplGetAll(rt.Ctx))
}
func (rt *Router) taskTplStatistics(c *gin.Context) {
ginx.NewRender(c).Data(models.TaskTplStatistics(rt.Ctx))
}
type taskTplForm struct {
Title string `json:"title" binding:"required"`
Batch int `json:"batch"`

View File

@@ -5,6 +5,7 @@ import (
"strings"
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/flashduty"
"github.com/ccfos/nightingale/v6/pkg/ormx"
"github.com/gin-gonic/gin"
@@ -94,6 +95,7 @@ func (rt *Router) userAddPost(c *gin.Context) {
UpdateBy: username,
}
ginx.Dangerous(u.Verify())
ginx.NewRender(c).Message(u.Add(rt.Ctx))
}
@@ -143,6 +145,11 @@ func (rt *Router) userProfilePut(c *gin.Context) {
}
target := User(rt.Ctx, ginx.UrlParamInt64(c, "id"))
oldInfo := models.User{
Username: target.Username,
Phone: target.Phone,
Email: target.Email,
}
target.Nickname = f.Nickname
target.Phone = f.Phone
target.Email = f.Email
@@ -150,6 +157,10 @@ func (rt *Router) userProfilePut(c *gin.Context) {
target.Contacts = f.Contacts
target.UpdateBy = c.MustGet("username").(string)
if flashduty.NeedSyncUser(rt.Ctx) {
flashduty.UpdateUser(rt.Ctx, oldInfo, f.Email, f.Phone)
}
ginx.NewRender(c).Message(target.UpdateAllFields(rt.Ctx))
}

View File

@@ -5,23 +5,27 @@ import (
"time"
"github.com/ccfos/nightingale/v6/center/cconf"
"github.com/ccfos/nightingale/v6/memsto"
"github.com/ccfos/nightingale/v6/models"
"github.com/ccfos/nightingale/v6/pkg/cas"
"github.com/ccfos/nightingale/v6/pkg/ctx"
"github.com/ccfos/nightingale/v6/pkg/ldapx"
"github.com/ccfos/nightingale/v6/pkg/oauth2x"
"github.com/ccfos/nightingale/v6/pkg/oidcx"
"github.com/ccfos/nightingale/v6/pkg/tplx"
"github.com/BurntSushi/toml"
"github.com/toolkits/pkg/logger"
)
type SsoClient struct {
OIDC *oidcx.SsoClient
LDAP *ldapx.SsoClient
CAS *cas.SsoClient
OAuth2 *oauth2x.SsoClient
LastUpdateTime int64
OIDC *oidcx.SsoClient
LDAP *ldapx.SsoClient
CAS *cas.SsoClient
OAuth2 *oauth2x.SsoClient
LastUpdateTime int64
configCache *memsto.ConfigCache
configLastUpdateTime int64
}
const LDAP = `
@@ -111,7 +115,7 @@ Phone = 'phone_number'
Email = 'email'
`
func Init(center cconf.Center, ctx *ctx.Context) *SsoClient {
func Init(center cconf.Center, ctx *ctx.Context, configCache *memsto.ConfigCache) *SsoClient {
ssoClient := new(SsoClient)
m := make(map[string]string)
m["LDAP"] = LDAP
@@ -140,6 +144,11 @@ func Init(center cconf.Center, ctx *ctx.Context) *SsoClient {
log.Fatalln(err)
}
}
if configCache == nil {
logger.Error("configCache is nil, sso initialization failed")
}
ssoClient.configCache = configCache
userVariableMap := configCache.Get()
configs, err := models.SsoConfigGets(ctx)
if err != nil {
@@ -147,6 +156,7 @@ func Init(center cconf.Center, ctx *ctx.Context) *SsoClient {
}
for _, cfg := range configs {
cfg.Content = tplx.ReplaceTemplateUseText(cfg.Name, cfg.Content, userVariableMap)
switch cfg.Name {
case "LDAP":
var config ldapx.Config
@@ -185,7 +195,7 @@ func Init(center cconf.Center, ctx *ctx.Context) *SsoClient {
}
}
ssoClient.SyncSsoUsers(ctx)
go ssoClient.SyncSsoUsers(ctx)
go ssoClient.Reload(ctx)
return ssoClient
}
@@ -197,7 +207,8 @@ func (s *SsoClient) reload(ctx *ctx.Context) error {
return err
}
if lastUpdateTime == s.LastUpdateTime {
lastCacheUpdateTime := s.configCache.GetLastUpdateTime()
if lastUpdateTime == s.LastUpdateTime && lastCacheUpdateTime == s.configLastUpdateTime {
return nil
}
@@ -205,8 +216,9 @@ func (s *SsoClient) reload(ctx *ctx.Context) error {
if err != nil {
return err
}
userVariableMap := s.configCache.Get()
for _, cfg := range configs {
cfg.Content = tplx.ReplaceTemplateUseText(cfg.Name, cfg.Content, userVariableMap)
switch cfg.Name {
case "LDAP":
var config ldapx.Config
@@ -250,6 +262,7 @@ func (s *SsoClient) reload(ctx *ctx.Context) error {
}
s.LastUpdateTime = lastUpdateTime
s.configLastUpdateTime = lastCacheUpdateTime
return nil
}

View File

@@ -8,6 +8,7 @@ import (
"github.com/ccfos/nightingale/v6/alert"
"github.com/ccfos/nightingale/v6/alert/astats"
"github.com/ccfos/nightingale/v6/alert/process"
alertrt "github.com/ccfos/nightingale/v6/alert/router"
"github.com/ccfos/nightingale/v6/center/metas"
"github.com/ccfos/nightingale/v6/conf"
"github.com/ccfos/nightingale/v6/dumper"
@@ -17,12 +18,12 @@ import (
"github.com/ccfos/nightingale/v6/pkg/logx"
"github.com/ccfos/nightingale/v6/prom"
"github.com/ccfos/nightingale/v6/pushgw/idents"
pushgwrt "github.com/ccfos/nightingale/v6/pushgw/router"
"github.com/ccfos/nightingale/v6/pushgw/writer"
"github.com/ccfos/nightingale/v6/storage"
"github.com/ccfos/nightingale/v6/tdengine"
alertrt "github.com/ccfos/nightingale/v6/alert/router"
pushgwrt "github.com/ccfos/nightingale/v6/pushgw/router"
"github.com/flashcatcloud/ibex/src/cmd/ibex"
)
func Initialize(configDir string, cryptoKey string) (func(), error) {
@@ -42,11 +43,9 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
ctx := ctx.NewContext(context.Background(), nil, false, config.CenterApi)
var redis storage.Redis
if config.Redis.Address != "" {
redis, err = storage.NewRedis(config.Redis)
if err != nil {
return nil, err
}
redis, err = storage.NewRedis(config.Redis)
if err != nil {
return nil, err
}
syncStats := memsto.NewSyncStats()
@@ -69,17 +68,22 @@ func Initialize(configDir string, cryptoKey string) (func(), error) {
notifyConfigCache := memsto.NewNotifyConfigCache(ctx, configCache)
userCache := memsto.NewUserCache(ctx, syncStats)
userGroupCache := memsto.NewUserGroupCache(ctx, syncStats)
taskTplsCache := memsto.NewTaskTplCache(ctx)
promClients := prom.NewPromClient(ctx)
tdengineClients := tdengine.NewTdengineClient(ctx, config.Alert.Heartbeat)
externalProcessors := process.NewExternalProcessors()
alert.Start(config.Alert, config.Pushgw, syncStats, alertStats, externalProcessors, targetCache, busiGroupCache, alertMuteCache,
alertRuleCache, notifyConfigCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
alertRuleCache, notifyConfigCache, taskTplsCache, dsCache, ctx, promClients, tdengineClients, userCache, userGroupCache)
alertrtRouter := alertrt.New(config.HTTP, config.Alert, alertMuteCache, targetCache, busiGroupCache, alertStats, ctx, externalProcessors)
alertrtRouter.Config(r)
if config.Ibex.Enable {
ibex.ServerStart(false, nil, redis, config.HTTP.APIForService.BasicAuth, config.Alert.Heartbeat, &config.CenterApi, r, nil, config.Ibex, config.HTTP.Port)
}
}
dumper.ConfigRouter(r)

View File

@@ -27,6 +27,7 @@ type ConfigType struct {
Pushgw pconf.Pushgw
Alert aconf.Alert
Center cconf.Center
Ibex Ibex
}
type CenterApi struct {
@@ -40,6 +41,17 @@ type GlobalConfig struct {
RunMode string
}
type Ibex struct {
Enable bool
RPCListen string
Output Output
}
type Output struct {
ComeFrom string
AgtdPort int
}
func InitConfig(configDir, cryptoKey string) (*ConfigType, error) {
var config = new(ConfigType)

View File

@@ -1,12 +0,0 @@
FROM python:3-slim
#FROM ubuntu:21.04
WORKDIR /app
ADD n9e /app
ADD http://download.flashcat.cloud/wait /wait
RUN chmod +x /wait
RUN chmod +x n9e
EXPOSE 17000
CMD ["/app/n9e", "-h"]

View File

@@ -3,7 +3,7 @@ FROM --platform=$TARGETPLATFORM python:3-slim
WORKDIR /app
ADD n9e /app/
ADD etc /app/
ADD etc /app/etc/
ADD integrations /app/integrations/
RUN pip install requests

View File

@@ -3,7 +3,7 @@ FROM --platform=$TARGETPLATFORM python:3-slim
WORKDIR /app
ADD n9e /app/
ADD etc /app/
ADD etc /app/etc/
ADD integrations /app/integrations/
EXPOSE 17000

View File

@@ -69,27 +69,6 @@ services:
command:
- "--loggerTimezone=Asia/Shanghai"
ibex:
image: flashcatcloud/ibex:v1.2.0
container_name: ibex
hostname: ibex
restart: always
environment:
GIN_MODE: release
TZ: Asia/Shanghai
WAIT_HOSTS: mysql:3306
volumes:
- ./etc-ibex:/app/etc
networks:
- nightingale
ports:
- "10090:10090"
- "20090:20090"
depends_on:
- mysql
command: >
sh -c "/app/ibex server"
nightingale:
image: flashcatcloud/nightingale:latest
container_name: nightingale
@@ -105,6 +84,7 @@ services:
- nightingale
ports:
- "17000:17000"
- "20090:20090"
depends_on:
- mysql
- redis
@@ -122,7 +102,7 @@ services:
HOST_PROC: /hostfs/proc
HOST_SYS: /hostfs/sys
HOST_MOUNT_PREFIX: /hostfs
WAIT_HOSTS: nightingale:17000, ibex:20090
WAIT_HOSTS: nightingale:17000, nightingale:20090
volumes:
- ./etc-categraf:/etc/categraf/conf
- /:/hostfs

View File

@@ -78,6 +78,6 @@ enable = true
## ibex flush interval
interval = "1000ms"
## n9e ibex server rpc address
servers = ["ibex:20090"]
servers = ["nightingale:20090"]
## temp script dir
meta_dir = "./meta"

View File

@@ -1,97 +0,0 @@
# debug, release
RunMode = "release"
[Log]
# log write dir
Dir = "logs-server"
# log level: DEBUG INFO WARNING ERROR
Level = "DEBUG"
# stdout, stderr, file
Output = "stdout"
# # rotate by time
# KeepHours: 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
[HTTP]
Enable = true
# http listening address
Host = "0.0.0.0"
# http listening port
Port = 10090
# https cert file path
CertFile = ""
# https key file path
KeyFile = ""
# whether print access log
PrintAccessLog = true
# whether enable pprof
PProf = false
# http graceful shutdown timeout, unit: s
ShutdownTimeout = 30
# max content length: 64M
MaxContentLength = 67108864
# http server read timeout, unit: s
ReadTimeout = 20
# http server write timeout, unit: s
WriteTimeout = 40
# http server idle timeout, unit: s
IdleTimeout = 120
[BasicAuth]
# using when call apis
ibex = "ibex"
[RPC]
Listen = "0.0.0.0:20090"
[Heartbeat]
# auto detect if blank
IP = ""
# unit: ms
Interval = 1000
[Output]
# database | remote
ComeFrom = "database"
AgtdPort = 2090
[Gorm]
# enable debug mode or not
Debug = false
# mysql postgres
DBType = "mysql"
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
[MySQL]
# mysql address host:port
Address = "mysql:3306"
# mysql username
User = "root"
# mysql password
Password = "1234"
# database name
DBName = "ibex"
# connection params
Parameters = "charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
[Postgres]
# pg address host:port
Address = "postgres:5432"
# pg user
User = "root"
# pg password
Password = "1234"
# database name
DBName = "ibex"
# ssl mode
SSLMode = "disable"

View File

@@ -96,8 +96,6 @@ MaxLifetime = 7200
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
# enable auto migrate or not
# EnableAutoMigrate = false
@@ -181,3 +179,7 @@ MaxIdleConnsPerHost = 100
# Regex = "([^:]+)(?::\\d+)?"
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

View File

@@ -42,23 +42,6 @@ services:
- "--enable-feature=remote-write-receiver"
- "--query.lookback-delta=2m"
ibex:
image: flashcatcloud/ibex:v0.5.0
container_name: ibex
hostname: ibex
restart: always
environment:
GIN_MODE: release
TZ: Asia/Shanghai
WAIT_HOSTS: 127.0.0.1:3306
volumes:
- ./etc-ibex:/app/etc
network_mode: host
depends_on:
- mysql
command: >
sh -c "/app/ibex server"
n9e:
image: flashcatcloud/nightingale:latest
container_name: n9e

View File

@@ -1,97 +0,0 @@
# debug, release
RunMode = "release"
[Log]
# log write dir
Dir = "logs-server"
# log level: DEBUG INFO WARNING ERROR
Level = "DEBUG"
# stdout, stderr, file
Output = "stdout"
# # rotate by time
# KeepHours: 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
[HTTP]
Enable = true
# http listening address
Host = "0.0.0.0"
# http listening port
Port = 10090
# https cert file path
CertFile = ""
# https key file path
KeyFile = ""
# whether print access log
PrintAccessLog = true
# whether enable pprof
PProf = false
# http graceful shutdown timeout, unit: s
ShutdownTimeout = 30
# max content length: 64M
MaxContentLength = 67108864
# http server read timeout, unit: s
ReadTimeout = 20
# http server write timeout, unit: s
WriteTimeout = 40
# http server idle timeout, unit: s
IdleTimeout = 120
[BasicAuth]
# using when call apis
ibex = "ibex"
[RPC]
Listen = "0.0.0.0:20090"
[Heartbeat]
# auto detect if blank
IP = ""
# unit: ms
Interval = 1000
[Output]
# database | remote
ComeFrom = "database"
AgtdPort = 2090
[Gorm]
# enable debug mode or not
Debug = false
# mysql postgres
DBType = "mysql"
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
[MySQL]
# mysql address host:port
Address = "127.0.0.1:3306"
# mysql username
User = "root"
# mysql password
Password = "1234"
# database name
DBName = "ibex"
# connection params
Parameters = "charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
[Postgres]
# pg address host:port
Address = "127.0.0.1:5432"
# pg user
User = "root"
# pg password
Password = "1234"
# database name
DBName = "ibex"
# ssl mode
SSLMode = "disable"

View File

@@ -97,8 +97,6 @@ MaxLifetime = 7200
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
# enable auto migrate or not
# EnableAutoMigrate = false
@@ -182,3 +180,7 @@ MaxIdleConnsPerHost = 100
# Regex = "([^:]+)(?::\\d+)?"
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

View File

@@ -42,23 +42,6 @@ services:
- "--enable-feature=remote-write-receiver"
- "--query.lookback-delta=2m"
ibex:
image: flashcatcloud/ibex:v0.5.0
container_name: ibex
hostname: ibex
restart: always
environment:
GIN_MODE: release
TZ: Asia/Shanghai
WAIT_HOSTS: 127.0.0.1:3306
volumes:
- ./etc-ibex:/app/etc
network_mode: host
depends_on:
- mysql
command: >
sh -c "/app/ibex server"
n9e:
image: flashcatcloud/nightingale:latest
container_name: n9e

View File

@@ -1,97 +0,0 @@
# debug, release
RunMode = "release"
[Log]
# log write dir
Dir = "logs-server"
# log level: DEBUG INFO WARNING ERROR
Level = "DEBUG"
# stdout, stderr, file
Output = "stdout"
# # rotate by time
# KeepHours: 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
[HTTP]
Enable = true
# http listening address
Host = "0.0.0.0"
# http listening port
Port = 10090
# https cert file path
CertFile = ""
# https key file path
KeyFile = ""
# whether print access log
PrintAccessLog = true
# whether enable pprof
PProf = false
# http graceful shutdown timeout, unit: s
ShutdownTimeout = 30
# max content length: 64M
MaxContentLength = 67108864
# http server read timeout, unit: s
ReadTimeout = 20
# http server write timeout, unit: s
WriteTimeout = 40
# http server idle timeout, unit: s
IdleTimeout = 120
[BasicAuth]
# using when call apis
ibex = "ibex"
[RPC]
Listen = "0.0.0.0:20090"
[Heartbeat]
# auto detect if blank
IP = ""
# unit: ms
Interval = 1000
[Output]
# database | remote
ComeFrom = "database"
AgtdPort = 2090
[Gorm]
# enable debug mode or not
Debug = false
# mysql postgres
DBType = "mysql"
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
[MySQL]
# mysql address host:port
Address = "127.0.0.1:3306"
# mysql username
User = "root"
# mysql password
Password = "1234"
# database name
DBName = "ibex"
# connection params
Parameters = "charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
[Postgres]
# pg address host:port
Address = "127.0.0.1:5432"
# pg user
User = "root"
# pg password
Password = "1234"
# database name
DBName = "ibex"
# ssl mode
SSLMode = "disable"

View File

@@ -97,8 +97,6 @@ MaxLifetime = 7200
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
# enable auto migrate or not
# EnableAutoMigrate = false
@@ -182,3 +180,7 @@ MaxIdleConnsPerHost = 100
# Regex = "([^:]+)(?::\\d+)?"
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

View File

@@ -51,29 +51,6 @@ services:
command:
- "--loggerTimezone=Asia/Shanghai"
ibex:
image: flashcatcloud/ibex:v1.2.0
container_name: ibex
hostname: ibex
restart: always
environment:
GIN_MODE: release
TZ: Asia/Shanghai
WAIT_HOSTS: postgres:5432
ports:
- "10090:10090"
- "20090:20090"
volumes:
- ./ibexetc_pg:/app/etc
networks:
- nightingale
depends_on:
- postgres
links:
- postgres:postgres
command: >
sh -c "/app/ibex server"
nightingale:
image: flashcatcloud/nightingale:latest
container_name: nightingale
@@ -93,12 +70,10 @@ services:
- postgres
- redis
- victoriametrics
- ibex
links:
- postgres:postgres
- redis:redis
- victoriametrics:victoriametrics
- ibex:ibex
command: >
sh -c "/app/n9e"
@@ -112,7 +87,7 @@ services:
HOST_PROC: /hostfs/proc
HOST_SYS: /hostfs/sys
HOST_MOUNT_PREFIX: /hostfs
WAIT_HOSTS: nightingale:17000, ibex:20090
WAIT_HOSTS: nightingale:17000, nightingale:20090
volumes:
- ./categraf/conf:/etc/categraf/conf
- /:/hostfs
@@ -124,7 +99,5 @@ services:
- nightingale
depends_on:
- nightingale
- ibex
links:
- nightingale:nightingale
- ibex:ibex
- nightingale:nightingale

View File

@@ -1,97 +0,0 @@
# debug, release
RunMode = "release"
[Log]
# log write dir
Dir = "logs-server"
# log level: DEBUG INFO WARNING ERROR
Level = "DEBUG"
# stdout, stderr, file
Output = "stdout"
# # rotate by time
# KeepHours: 4
# # rotate by size
# RotateNum = 3
# # unit: MB
# RotateSize = 256
[HTTP]
Enable = true
# http listening address
Host = "0.0.0.0"
# http listening port
Port = 10090
# https cert file path
CertFile = ""
# https key file path
KeyFile = ""
# whether print access log
PrintAccessLog = true
# whether enable pprof
PProf = false
# http graceful shutdown timeout, unit: s
ShutdownTimeout = 30
# max content length: 64M
MaxContentLength = 67108864
# http server read timeout, unit: s
ReadTimeout = 20
# http server write timeout, unit: s
WriteTimeout = 40
# http server idle timeout, unit: s
IdleTimeout = 120
[BasicAuth]
# using when call apis
ibex = "ibex"
[RPC]
Listen = "0.0.0.0:20090"
[Heartbeat]
# auto detect if blank
IP = ""
# unit: ms
Interval = 1000
[Output]
# database | remote
ComeFrom = "database"
AgtdPort = 2090
[Gorm]
# enable debug mode or not
Debug = false
# mysql postgres
DBType = "postgres"
# unit: s
MaxLifetime = 7200
# max open connections
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
[MySQL]
# mysql address host:port
Address = "mysql:3306"
# mysql username
User = "root"
# mysql password
Password = "1234"
# database name
DBName = "ibex"
# connection params
Parameters = "charset=utf8mb4&parseTime=True&loc=Local&allowNativePasswords=true"
[Postgres]
# pg address host:port
Address = "postgres:5432"
# pg user
User = "root"
# pg password
Password = "1234"
# database name
DBName = "n9e_v6"
# ssl mode
SSLMode = "disable"

View File

@@ -1,26 +1,30 @@
CREATE TABLE users (
id bigserial,
username varchar(64) not null ,
nickname varchar(64) not null ,
username varchar(64) not null,
nickname varchar(64) not null,
password varchar(128) not null default '',
phone varchar(16) not null default '',
email varchar(64) not null default '',
portrait varchar(255) not null default '' ,
roles varchar(255) not null ,
contacts varchar(1024) ,
maintainer smallint not null default 0,
portrait varchar(255) not null default '',
roles varchar(255) not null,
contacts varchar(1024),
maintainer boolean not null default false,
belong varchar(16) not null default '',
create_at bigint not null default 0,
create_by varchar(64) not null default '',
update_at bigint not null default 0,
update_by varchar(64) not null default '',
PRIMARY KEY (id),
UNIQUE (username)
) ;
COMMENT ON COLUMN users.username IS 'login name, cannot rename';
);
COMMENT ON COLUMN users.id IS 'id';
COMMENT ON COLUMN users.username IS 'login name, cannot rename';
COMMENT ON COLUMN users.nickname IS 'display name, chinese name';
COMMENT ON COLUMN users.portrait IS 'portrait image url';
COMMENT ON COLUMN users.roles IS 'Admin | Standard | Guest, split by space';
COMMENT ON COLUMN users.contacts IS 'json e.g. {wecom:xx, dingtalk_robot_token:yy}';
COMMENT ON COLUMN users.belong IS 'belong';
insert into users(id, username, nickname, password, roles, create_at, create_by, update_at, update_by) values(1, 'root', '超管', 'root.2020', 'Admin', date_part('epoch',current_timestamp)::int, 'system', date_part('epoch',current_timestamp)::int, 'system');
@@ -54,9 +58,16 @@ CREATE TABLE configs (
id bigserial,
ckey varchar(191) not null,
cval text not null default '',
note varchar(1024) not null default '',
external boolean not null default false,
encrypted boolean not null default false,
create_at bigint not null default 0,
create_by varchar(64) not null default '',
update_at bigint not null default 0,
update_by varchar(64) not null default '',
PRIMARY KEY (id),
UNIQUE (ckey)
) ;
);
CREATE TABLE role (
id bigserial,
@@ -366,32 +377,37 @@ COMMENT ON COLUMN alert_mute.disabled IS '0:enabled 1:disabled';
CREATE TABLE alert_subscribe (
id bigserial,
name varchar(255) not null default '',
disabled smallint not null default 0 ,
group_id bigint not null default 0 ,
disabled boolean not null default false,
group_id bigint not null default 0,
prod varchar(255) not null default '',
cate varchar(128) not null,
datasource_ids varchar(255) not null default '' ,
datasource_ids varchar(255) not null default '',
cluster varchar(128) not null,
rule_id bigint not null default 0,
severities varchar(32) not null default '',
tags varchar(4096) not null default '[]',
redefine_severity smallint default 0 ,
new_severity smallint not null ,
new_severity smallint not null,
redefine_channels smallint default 0 ,
new_channels varchar(255) not null default '' ,
user_group_ids varchar(250) not null ,
new_channels varchar(255) not null default '',
user_group_ids varchar(250) not null,
busi_groups VARCHAR(4096) NOT NULL DEFAULT '[]',
note VARCHAR(1024) DEFAULT '',
rule_ids VARCHAR(1024) DEFAULT '',
webhooks text not null,
extra_config text not null,
redefine_webhooks smallint default 0,
redefine_webhooks boolean default false,
for_duration bigint not null default 0,
create_at bigint not null default 0,
create_by varchar(64) not null default '',
update_at bigint not null default 0,
update_by varchar(64) not null default '',
PRIMARY KEY (id)
) ;
CREATE INDEX alert_subscribe_group_id_idx ON alert_subscribe (group_id);
CREATE INDEX alert_subscribe_update_at_idx ON alert_subscribe (update_at);
);
CREATE INDEX ON alert_subscribe (update_at);
CREATE INDEX ON alert_subscribe (group_id);
COMMENT ON COLUMN alert_subscribe.disabled IS '0:enabled 1:disabled';
COMMENT ON COLUMN alert_subscribe.group_id IS 'busi group id';
COMMENT ON COLUMN alert_subscribe.datasource_ids IS 'datasource ids';
@@ -401,25 +417,34 @@ COMMENT ON COLUMN alert_subscribe.new_severity IS '0:Emergency 1:Warning 2:Notic
COMMENT ON COLUMN alert_subscribe.redefine_channels IS 'is redefine channels?';
COMMENT ON COLUMN alert_subscribe.new_channels IS 'split by space: sms voice email dingtalk wecom';
COMMENT ON COLUMN alert_subscribe.user_group_ids IS 'split by space 1 34 5, notify cc to user_group_ids';
COMMENT ON COLUMN alert_subscribe.note IS 'note';
COMMENT ON COLUMN alert_subscribe.rule_ids IS 'rule_ids';
COMMENT ON COLUMN alert_subscribe.extra_config IS 'extra_config';
CREATE TABLE target (
id bigserial,
group_id bigint not null default 0 ,
ident varchar(191) not null ,
note varchar(255) not null default '' ,
tags varchar(512) not null default '' ,
group_id bigint not null default 0,
ident varchar(191) not null,
note varchar(255) not null default '',
tags varchar(512) not null default '',
host_ip varchar(15) default '',
agent_version varchar(255) default '',
engine_name varchar(255) default '',
update_at bigint not null default 0,
PRIMARY KEY (id),
UNIQUE (ident)
) ;
CREATE INDEX target_group_id_idx ON target (group_id);
);
CREATE INDEX ON target (group_id);
COMMENT ON COLUMN target.group_id IS 'busi group id';
COMMENT ON COLUMN target.ident IS 'target id';
COMMENT ON COLUMN target.note IS 'append to alert event as field';
COMMENT ON COLUMN target.tags IS 'append to series data as tags, split by space, append external space at suffix';
COMMENT ON COLUMN target.host_ip IS 'IPv4 string';
COMMENT ON COLUMN target.agent_version IS 'agent version';
COMMENT ON COLUMN target.engine_name IS 'engine_name';
-- case1: target_idents; case2: target_tags
-- CREATE TABLE collect_rule (
-- id bigserial,
@@ -606,6 +631,7 @@ CREATE TABLE alert_his_event (
CREATE INDEX alert_his_event_hash_idx ON alert_his_event (hash);
CREATE INDEX alert_his_event_rule_id_idx ON alert_his_event (rule_id);
CREATE INDEX alert_his_event_tg_idx ON alert_his_event (trigger_time, group_id);
CREATE INDEX alert_his_event_nrn_idx ON alert_his_event (last_eval_time);
COMMENT ON COLUMN alert_his_event.group_id IS 'busi group id of rule';
COMMENT ON COLUMN alert_his_event.datasource_id IS 'datasource id';
COMMENT ON COLUMN alert_his_event.group_name IS 'busi group name';
@@ -717,6 +743,7 @@ CREATE TABLE datasource
status varchar(255) not null default '',
http varchar(4096) not null default '',
auth varchar(8192) not null default '',
is_default smallint not null default 0,
created_at bigint not null default 0,
created_by varchar(64) not null default '',
updated_at bigint not null default 0,
@@ -737,17 +764,22 @@ CREATE TABLE notify_tpl (
channel varchar(32) not null,
name varchar(255) not null,
content text not null,
create_at bigint not null default 0,
create_by varchar(64) not null default '',
update_at bigint not null default 0,
update_by varchar(64) not null default '',
PRIMARY KEY (id),
UNIQUE (channel)
) ;
);
CREATE TABLE sso_config (
id bigserial,
name varchar(191) not null,
content text not null,
update_at bigint not null default 0,
PRIMARY KEY (id),
UNIQUE (name)
) ;
);
CREATE TABLE es_index_pattern (
@@ -765,3 +797,38 @@ CREATE TABLE es_index_pattern (
UNIQUE (datasource_id, name)
) ;
COMMENT ON COLUMN es_index_pattern.datasource_id IS 'datasource id';
CREATE TABLE builtin_metrics (
id bigserial,
collector varchar(191) NOT NULL,
typ varchar(191) NOT NULL,
name varchar(191) NOT NULL,
unit varchar(191) NOT NULL,
lang varchar(191) NOT NULL DEFAULT '',
note varchar(4096) NOT NULL,
expression varchar(4096) NOT NULL,
created_at bigint NOT NULL DEFAULT 0,
created_by varchar(191) NOT NULL DEFAULT '',
updated_at bigint NOT NULL DEFAULT 0,
updated_by varchar(191) NOT NULL DEFAULT '',
PRIMARY KEY (id),
UNIQUE (lang, collector, typ, name)
);
CREATE INDEX idx_collector ON builtin_metrics (collector);
CREATE INDEX idx_typ ON builtin_metrics (typ);
CREATE INDEX idx_name ON builtin_metrics (name);
CREATE INDEX idx_lang ON builtin_metrics (lang);
COMMENT ON COLUMN builtin_metrics.id IS 'unique identifier';
COMMENT ON COLUMN builtin_metrics.collector IS 'type of collector';
COMMENT ON COLUMN builtin_metrics.typ IS 'type of metric';
COMMENT ON COLUMN builtin_metrics.name IS 'name of metric';
COMMENT ON COLUMN builtin_metrics.unit IS 'unit of metric';
COMMENT ON COLUMN builtin_metrics.lang IS 'language of metric';
COMMENT ON COLUMN builtin_metrics.note IS 'description of metric in Chinese';
COMMENT ON COLUMN builtin_metrics.expression IS 'expression of metric';
COMMENT ON COLUMN builtin_metrics.created_at IS 'create time';
COMMENT ON COLUMN builtin_metrics.created_by IS 'creator';
COMMENT ON COLUMN builtin_metrics.updated_at IS 'update time';
COMMENT ON COLUMN builtin_metrics.updated_by IS 'updater';

View File

@@ -92,8 +92,6 @@ MaxLifetime = 7200
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
# enable auto migrate or not
# EnableAutoMigrate = false
@@ -177,3 +175,7 @@ MaxIdleConnsPerHost = 100
# Regex = "([^:]+)(?::\\d+)?"
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = true
RPCListen = "0.0.0.0:20090"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,40 +1,34 @@
use n9e_v6;
/* v7.0.0-beta.3 */
CREATE TABLE `builtin_metrics` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'unique identifier',
`collector` varchar(191) NOT NULL COMMENT 'type of collector',
`typ` varchar(191) NOT NULL COMMENT 'type of metric',
`name` varchar(191) NOT NULL COMMENT 'name of metric',
`unit` varchar(191) NOT NULL COMMENT 'unit of metric',
`lang` varchar(191) NOT NULL DEFAULT '' COMMENT 'language of metric',
`note` varchar(4096) NOT NULL COMMENT 'description of metric in Chinese',
`expression` varchar(4096) NOT NULL COMMENT 'expression of metric',
`created_at` bigint NOT NULL DEFAULT 0 COMMENT 'create time',
`created_by` varchar(191) NOT NULL DEFAULT '' COMMENT 'creator',
`updated_at` bigint NOT NULL DEFAULT 0 COMMENT 'update time',
`updated_by` varchar(191) NOT NULL DEFAULT '' COMMENT 'updater',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_collector_typ_name` (`lang`,`collector`, `typ`, `name`),
INDEX `idx_collector` (`collector`),
INDEX `idx_typ` (`typ`),
INDEX `idx_name` (`name`),
INDEX `idx_lang` (`lang`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Alter table for AlertSubscribe
ALTER TABLE alert_subscribe ADD COLUMN busi_groups VARCHAR(4096) NOT NULL DEFAULT '[]';
ALTER TABLE alert_subscribe ADD COLUMN note VARCHAR(1024) DEFAULT '' COMMENT 'note';
ALTER TABLE alert_subscribe ADD COLUMN rule_ids VARCHAR(1024) DEFAULT '' COMMENT 'rule_ids';
-- Alter table for TaskRecord
ALTER TABLE task_record ADD COLUMN event_id BIGINT(20) NOT NULL DEFAULT 0 COMMENT 'event id';
-- Alter table for AlertHisEvent
CREATE INDEX idx_last_eval_time ON alert_his_event (last_eval_time);
-- Alter table for Target
ALTER TABLE target ADD COLUMN host_ip VARCHAR(15) DEFAULT '' COMMENT 'IPv4 string';
ALTER TABLE target ADD COLUMN agent_version VARCHAR(255) DEFAULT '' COMMENT 'agent version';
ALTER TABLE target ADD COLUMN engine_name VARCHAR(255) DEFAULT '' COMMENT 'engine_name';
-- Alter table for Datasource
ALTER TABLE datasource ADD COLUMN is_default TINYINT NOT NULL DEFAULT 0 COMMENT 'is default datasource';
-- Alter table for Configs
ALTER TABLE configs ADD COLUMN note VARCHAR(1024) DEFAULT '' COMMENT 'note';
ALTER TABLE configs ADD COLUMN external INT DEFAULT 0 COMMENT '0: built-in 1: external';
ALTER TABLE configs ADD COLUMN encrypted INT DEFAULT 0 COMMENT '0: plaintext 1: ciphertext';
ALTER TABLE configs ADD COLUMN create_at INT DEFAULT 0 COMMENT 'create_at';
ALTER TABLE configs ADD COLUMN create_by VARCHAR(64) DEFAULT '' COMMENT 'create_by';
ALTER TABLE configs ADD COLUMN update_at INT DEFAULT 0 COMMENT 'update_at';
ALTER TABLE configs ADD COLUMN update_by VARCHAR(64) DEFAULT '' COMMENT 'update_by';
ALTER TABLE configs DROP INDEX ckey;
ALTER TABLE notify_tpl ADD COLUMN create_at INT DEFAULT 0 COMMENT 'create_at';
ALTER TABLE notify_tpl ADD COLUMN create_by VARCHAR(64) DEFAULT '' COMMENT 'create_by';
ALTER TABLE notify_tpl ADD COLUMN update_at INT DEFAULT 0 COMMENT 'update_at';
ALTER TABLE notify_tpl ADD COLUMN update_by VARCHAR(64) DEFAULT '' COMMENT 'update_by';
-- Alter table for Users
ALTER TABLE users ADD COLUMN belong VARCHAR(16) DEFAULT '' COMMENT 'belong';
ALTER TABLE `sso_config` ADD COLUMN `update_at` INT NOT NULL DEFAULT 0 COMMENT 'update_at';
CREATE TABLE `metric_filter` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'unique identifier',
`name` varchar(191) NOT NULL COMMENT 'name of metric filter',
`configs` varchar(4096) NOT NULL COMMENT 'configuration of metric filter',
`groups_perm` text,
`create_at` bigint NOT NULL DEFAULT '0' COMMENT 'create time',
`create_by` varchar(191) NOT NULL DEFAULT '' COMMENT 'creator',
`update_at` bigint NOT NULL DEFAULT '0' COMMENT 'update time',
`update_by` varchar(191) NOT NULL DEFAULT '' COMMENT 'updater',
PRIMARY KEY (`id`),
KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

View File

@@ -27,7 +27,7 @@ KeyFile = ""
# whether print access log
PrintAccessLog = false
# whether enable pprof
PProf = false
PProf = true
# expose prometheus /metrics?
ExposeMetrics = true
# http graceful shutdown timeout, unit: s
@@ -88,8 +88,6 @@ MaxLifetime = 7200
MaxOpenConns = 150
# max idle connections
MaxIdleConns = 50
# table prefix
TablePrefix = ""
# enable auto migrate or not
# EnableAutoMigrate = false
@@ -167,9 +165,13 @@ MaxIdleConnsPerHost = 100
# TLSCert = "/etc/n9e/cert.pem"
# TLSKey = "/etc/n9e/key.pem"
# InsecureSkipVerify = false
# [[Writers.WriteRelabels]]
# [[Pushgw.Writers.WriteRelabels]]
# Action = "replace"
# SourceLabels = ["__address__"]
# Regex = "([^:]+)(?::\\d+)?"
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = false
RPCListen = "0.0.0.0:20090"

View File

@@ -116,6 +116,12 @@ MaxIdleConnsPerHost = 100
# Replacement = "$1:80"
# TargetLabel = "__address__"
[Ibex]
Enable = false
RPCListen = "0.0.0.0:20090"
# n9e-edge cannot directly reuse the redis that n9e relies on at the center.
# It needs to deploy a separate redis in the edge region for n9e-edge to use.
[Redis]
# address, ip:port or ip1:port,ip2:port for cluster and sentinel(SentinelAddrs)
Address = "127.0.0.1:6379"
@@ -129,4 +135,4 @@ RedisType = "standalone"
# Mastername for sentinel type
# MasterName = "mymaster"
# SentinelUsername = ""
# SentinelPassword = ""
# SentinelPassword = ""

12
go.mod
View File

@@ -8,6 +8,7 @@ require (
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/expr-lang/expr v1.16.1
github.com/flashcatcloud/ibex v1.3.3
github.com/gin-contrib/pprof v1.4.0
github.com/gin-gonic/gin v1.9.1
github.com/go-ldap/ldap/v3 v3.4.4
@@ -46,12 +47,15 @@ require (
github.com/bytedance/sonic v1.9.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
github.com/dennwc/varint v1.0.0 // indirect
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
github.com/fatih/camelcase v1.0.0 // indirect
github.com/fatih/structs v1.1.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.2 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
github.com/go-kit/log v0.2.1 // indirect
github.com/go-logfmt/logfmt v0.6.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.14.0 // indirect
@@ -82,12 +86,14 @@ require (
github.com/tidwall/pretty v1.2.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.11 // indirect
go.uber.org/atomic v1.11.0 // indirect
go.uber.org/automaxprocs v1.5.2 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect
golang.org/x/image v0.13.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.15.0 // indirect
golang.org/x/net v0.23.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/protobuf v1.33.0 // indirect

42
go.sum
View File

@@ -1,9 +1,16 @@
github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 h1:8q4SaHjFsClSvuVne0ID/5Ka8u3fcIHyqkLjcFpNRHQ=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY=
github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e h1:NeAW1fUYUEWhft7pkxDf6WoUvEZJ/uOKsvtpjLnn8MU=
github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/Masterminds/semver/v3 v3.1.1 h1:hLg3sBzpNErnxhQtUy/mmLR2I9foDujNK030IGemrRc=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
github.com/aws/aws-sdk-go v1.44.302 h1:ST3ko6GrJKn3Xi+nAvxjG3uk/V1pW8KC52WLeIxqqNk=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bsm/ginkgo/v2 v2.5.0 h1:aOAnND1T40wEdAtkGSkvSICWeQ8L3UASX7YVCqQx+eQ=
@@ -28,6 +35,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
@@ -38,6 +47,8 @@ github.com/fatih/camelcase v1.0.0 h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/flashcatcloud/ibex v1.3.3 h1:1Bxk5sgpsq4+e9bMchucGttg8Sw4KEpZy9tctFfj/cE=
github.com/flashcatcloud/ibex v1.3.3/go.mod h1:T8hbMUySK2q6cXUaYp0AUVeKkU9Od2LjzwmB5lmTRBM=
github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU=
github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
@@ -51,9 +62,13 @@ github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SU
github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A=
github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
github.com/go-ldap/ldap/v3 v3.4.4 h1:qPjipEpt+qDa6SI/h1fzuGWoRUY+qqQ9sOZq67/PYUs=
github.com/go-ldap/ldap/v3 v3.4.4/go.mod h1:fe1MsuN5eJJ1FeLT/LEBVdWfNWKh459R7aXgXtJC+aI=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
@@ -78,6 +93,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -149,12 +165,15 @@ github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkr
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
@@ -171,6 +190,7 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
@@ -198,9 +218,12 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw=
github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E=
github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
github.com/pelletier/go-toml/v2 v2.0.1/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
@@ -216,6 +239,7 @@ github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUo
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk=
github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
github.com/prometheus/prometheus v0.47.1 h1:bd2LiZyxzHn9Oo2Ei4eK2D86vz/L/OiqR1qYo0XmMBo=
@@ -280,9 +304,12 @@ go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q=
go.uber.org/automaxprocs v1.5.2 h1:2LxUOGiR3O6tw8ui5sZa2LAaHnsviZdVOUZw4fvbnME=
go.uber.org/automaxprocs v1.5.2/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
@@ -307,8 +334,10 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw=
golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/image v0.13.0 h1:3cge/F/QTkNLauhf2QoE9zp+7sr+ZcL4HnoZmdwg9sg=
golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
@@ -331,8 +360,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -341,6 +370,7 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -363,8 +393,8 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=

View File

@@ -203,8 +203,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -253,8 +255,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -303,8 +307,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -353,8 +359,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -413,8 +421,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -463,8 +473,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -587,8 +599,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -637,8 +651,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -687,8 +703,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -811,8 +829,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -861,8 +881,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -911,8 +933,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -920,4 +944,4 @@
}
]
}
}
}

View File

@@ -670,8 +670,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -720,8 +722,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -770,8 +774,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -820,8 +826,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -886,8 +894,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -936,8 +946,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1002,8 +1014,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1052,8 +1066,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1133,8 +1149,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1199,8 +1217,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1249,8 +1269,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1299,8 +1321,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1359,8 +1383,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1414,8 +1440,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1464,8 +1492,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1545,8 +1575,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1615,8 +1647,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1665,8 +1699,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1725,8 +1761,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1780,8 +1818,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1845,8 +1885,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -1854,4 +1896,4 @@
}
]
}
}
}

View File

@@ -107,8 +107,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -156,8 +158,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -205,8 +209,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -260,8 +266,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -269,4 +277,4 @@
}
]
}
}
}

View File

@@ -21,10 +21,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -85,10 +85,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -149,10 +149,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -227,10 +227,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -296,10 +296,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -365,10 +365,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -434,10 +434,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -498,10 +498,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -562,10 +562,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -640,10 +640,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -702,10 +702,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -792,4 +792,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -110,8 +110,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -179,8 +181,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -228,8 +232,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -287,8 +293,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -341,8 +349,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -405,8 +415,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4,
"datasourceCate": "prometheus",
@@ -414,4 +426,4 @@
}
]
}
}
}

View File

@@ -73,9 +73,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -137,9 +137,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -201,9 +201,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -284,9 +284,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -353,9 +353,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -422,9 +422,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -486,9 +486,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -550,9 +550,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -614,9 +614,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -690,9 +690,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -753,9 +753,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -792,4 +792,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -79,9 +79,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": true,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -140,9 +140,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -201,9 +201,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -269,9 +269,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": true,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -337,9 +337,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": true,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -349,4 +349,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -62,10 +62,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -117,10 +117,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -175,10 +175,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -232,10 +232,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -321,4 +321,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -70,9 +70,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -131,9 +131,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": true,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -192,9 +192,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -253,9 +253,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -314,9 +314,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -375,9 +375,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -436,9 +436,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -513,9 +513,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -576,9 +576,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -639,9 +639,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -716,9 +716,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -779,9 +779,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -842,9 +842,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -919,9 +919,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -982,9 +982,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1045,9 +1045,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1108,9 +1108,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1171,9 +1171,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1234,9 +1234,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1263,4 +1263,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -168,9 +168,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -231,9 +231,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -294,9 +294,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -357,9 +357,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -459,9 +459,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -471,4 +471,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -88,9 +88,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -149,9 +149,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -210,9 +210,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -271,9 +271,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -334,9 +334,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -397,9 +397,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -460,9 +460,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -523,9 +523,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -605,9 +605,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -673,9 +673,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -741,9 +741,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -809,9 +809,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -891,9 +891,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -959,9 +959,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1027,9 +1027,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1095,9 +1095,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1107,4 +1107,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -76,9 +76,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -142,9 +142,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -210,9 +210,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -287,9 +287,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -350,9 +350,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -413,9 +413,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -476,9 +476,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -554,9 +554,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -632,9 +632,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -700,9 +700,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -768,9 +768,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -845,9 +845,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -908,9 +908,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -976,9 +976,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1058,9 +1058,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1126,9 +1126,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1194,9 +1194,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1262,9 +1262,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1330,9 +1330,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1398,9 +1398,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1466,9 +1466,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1548,9 +1548,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1616,9 +1616,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1684,9 +1684,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1752,9 +1752,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1820,9 +1820,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1888,9 +1888,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1956,9 +1956,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2033,9 +2033,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2096,9 +2096,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2159,9 +2159,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2222,9 +2222,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2285,9 +2285,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2348,9 +2348,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2411,9 +2411,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2474,9 +2474,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2537,9 +2537,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2567,4 +2567,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -68,10 +68,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -129,10 +129,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -190,10 +190,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -251,10 +251,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -312,10 +312,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -373,10 +373,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -436,10 +436,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -499,10 +499,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -560,10 +560,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -621,10 +621,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -720,4 +720,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -62,10 +62,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -117,10 +117,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -172,10 +172,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -227,10 +227,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -331,4 +331,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -70,10 +70,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -133,10 +133,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -196,10 +196,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -259,10 +259,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -322,10 +322,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -385,10 +385,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -462,10 +462,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -552,4 +552,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -62,10 +62,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -117,10 +117,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -172,10 +172,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -227,10 +227,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -316,4 +316,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -21,10 +21,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -86,10 +86,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -151,10 +151,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -216,10 +216,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -281,10 +281,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -360,10 +360,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -425,10 +425,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -490,10 +490,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -555,10 +555,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -618,10 +618,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -683,10 +683,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -746,10 +746,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -811,10 +811,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -874,10 +874,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -939,10 +939,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1002,10 +1002,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1065,10 +1065,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1128,10 +1128,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1191,10 +1191,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1254,10 +1254,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1317,10 +1317,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1380,10 +1380,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1443,10 +1443,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1506,10 +1506,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1569,10 +1569,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1632,10 +1632,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1695,10 +1695,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1774,10 +1774,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1888,4 +1888,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -21,10 +21,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -86,10 +86,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -150,10 +150,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -214,10 +214,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -279,10 +279,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -344,10 +344,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -434,4 +434,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -22,10 +22,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -87,10 +87,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -152,10 +152,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -217,10 +217,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -282,10 +282,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -361,10 +361,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -426,10 +426,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -491,10 +491,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -556,10 +556,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -619,10 +619,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -684,10 +684,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -747,10 +747,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -812,10 +812,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -875,10 +875,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -940,10 +940,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1003,10 +1003,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1066,10 +1066,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1129,10 +1129,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1192,10 +1192,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1255,10 +1255,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1318,10 +1318,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1381,10 +1381,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1444,10 +1444,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1507,10 +1507,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1570,10 +1570,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1633,10 +1633,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1696,10 +1696,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1775,10 +1775,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -1879,4 +1879,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -63,10 +63,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -123,10 +123,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -178,10 +178,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -243,10 +243,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -305,10 +305,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -385,4 +385,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -93,9 +93,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -159,9 +159,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -220,9 +220,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -286,9 +286,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -354,9 +354,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -422,9 +422,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -485,9 +485,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -548,9 +548,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -611,9 +611,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -674,9 +674,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -737,9 +737,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -798,9 +798,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -864,9 +864,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -940,9 +940,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1001,9 +1001,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1027,4 +1027,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -7,10 +7,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -62,10 +62,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -117,10 +117,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -172,10 +172,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -227,10 +227,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -282,10 +282,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -355,4 +355,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -1370,9 +1370,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1437,9 +1437,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1504,9 +1504,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1566,9 +1566,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1618,8 +1618,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4
},
@@ -1676,9 +1678,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1728,8 +1730,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4
},
@@ -1776,8 +1780,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4
},
@@ -1829,8 +1835,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4
},
@@ -2022,9 +2030,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2083,9 +2091,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2144,9 +2152,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2205,9 +2213,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2273,8 +2281,10 @@
"version": "3.0.0",
"drawStyle": "lines",
"lineInterpolation": "linear",
"fillOpacity": 0.5,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"maxPerRow": 4
},
@@ -2436,9 +2446,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2508,9 +2518,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2570,9 +2580,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2797,9 +2807,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2864,9 +2874,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -2875,4 +2885,4 @@
}
]
}
}
}

View File

@@ -665,9 +665,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ee0c56e0-8f8e-4cbe-ac41-de2afad7b75a",
"layout": {
@@ -710,9 +712,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5c361278-8a94-4b16-afdd-e6def804b9ff",
"layout": {
@@ -755,10 +759,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -812,10 +816,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -869,9 +873,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a0096936-3790-40a1-b2ad-d7805945b948",
"layout": {
@@ -927,9 +933,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45aafb11-c694-4686-89ab-685068f91560",
"layout": {
@@ -967,9 +975,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "09ca6329-8eec-4a61-b19e-9bbeea2b9712",
"layout": {
@@ -1025,9 +1035,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "6c0d9b3c-dda5-4da9-825e-33f650dbb008",
"layout": {
@@ -1067,9 +1079,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4f7ce5a7-2771-4cbf-a569-b1a90b070b93",
"layout": {
@@ -1127,9 +1141,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "e98839c4-e3f3-4e6e-be3a-c44b70e6072c",
"layout": {
@@ -1167,9 +1183,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45c4e3d9-90f1-41bd-8169-1d8c0a921ba9",
"layout": {
@@ -1207,9 +1225,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "3b2a922d-4423-4845-8cfc-95970f3300d6",
"layout": {
@@ -1247,9 +1267,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "764fbcf7-3056-41ef-b62a-51813a6c315f",
"layout": {
@@ -1287,9 +1309,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "7cc04ae4-946d-4837-9ea9-764a7cc2eecd",
"layout": {
@@ -1345,9 +1369,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ad0445b0-8539-440d-bbf4-712450132a7a",
"layout": {
@@ -1385,9 +1411,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "c3cf6c57-c4ce-4bc2-a150-df32c4951144",
"layout": {
@@ -1425,9 +1453,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "022db454-70ba-49f5-8c11-f89b76d145cb",
"layout": {
@@ -1465,9 +1495,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "f20bad4f-656c-428a-a1cf-aafb7d92137c",
"layout": {
@@ -1520,9 +1552,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "cefafeb9-fc8a-4c73-92b3-648cd6f08b11",
"layout": {
@@ -1560,9 +1594,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "0ab67903-16ea-4001-b784-ae04d8b815c0",
"layout": {
@@ -1600,9 +1636,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "bb5dc07d-673b-4e2d-b44c-441acfa7c27b",
"layout": {
@@ -1640,9 +1678,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4cac1498-c141-483f-97c6-e1177317a2ea",
"layout": {
@@ -1695,9 +1735,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5247f393-a934-4d9e-be0f-40b177d2be80",
"layout": {
@@ -1738,9 +1780,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "b87c56f7-4e50-4d15-8bcd-1218fee879d9",
"layout": {
@@ -1781,9 +1825,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ae2d0a7a-b6cd-4fd5-99d4-3c4289b8b5a8",
"layout": {
@@ -1824,9 +1870,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "78e4badc-8d51-4aa6-81c5-d1c9183810a2",
"layout": {
@@ -1867,9 +1915,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "296b43f1-2f33-492a-bce8-6f0fde1e7b52",
"layout": {
@@ -1924,9 +1974,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "1537acaa-d5ce-48c5-b740-26fd543eb120",
"layout": {
@@ -1964,9 +2016,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a1c34fa4-4549-41a6-8d31-d25e7d860106",
"layout": {
@@ -2031,4 +2085,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -665,9 +665,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ee0c56e0-8f8e-4cbe-ac41-de2afad7b75a",
"layout": {
@@ -710,9 +712,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5c361278-8a94-4b16-afdd-e6def804b9ff",
"layout": {
@@ -755,10 +759,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -812,10 +816,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -869,9 +873,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a0096936-3790-40a1-b2ad-d7805945b948",
"layout": {
@@ -927,9 +933,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45aafb11-c694-4686-89ab-685068f91560",
"layout": {
@@ -967,9 +975,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "09ca6329-8eec-4a61-b19e-9bbeea2b9712",
"layout": {
@@ -1025,9 +1035,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "6c0d9b3c-dda5-4da9-825e-33f650dbb008",
"layout": {
@@ -1067,9 +1079,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4f7ce5a7-2771-4cbf-a569-b1a90b070b93",
"layout": {
@@ -1127,9 +1141,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "e98839c4-e3f3-4e6e-be3a-c44b70e6072c",
"layout": {
@@ -1167,9 +1183,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45c4e3d9-90f1-41bd-8169-1d8c0a921ba9",
"layout": {
@@ -1207,9 +1225,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "3b2a922d-4423-4845-8cfc-95970f3300d6",
"layout": {
@@ -1247,9 +1267,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "764fbcf7-3056-41ef-b62a-51813a6c315f",
"layout": {
@@ -1287,9 +1309,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "7cc04ae4-946d-4837-9ea9-764a7cc2eecd",
"layout": {
@@ -1345,9 +1369,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ad0445b0-8539-440d-bbf4-712450132a7a",
"layout": {
@@ -1385,9 +1411,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "c3cf6c57-c4ce-4bc2-a150-df32c4951144",
"layout": {
@@ -1425,9 +1453,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "022db454-70ba-49f5-8c11-f89b76d145cb",
"layout": {
@@ -1465,9 +1495,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "f20bad4f-656c-428a-a1cf-aafb7d92137c",
"layout": {
@@ -1520,9 +1552,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "cefafeb9-fc8a-4c73-92b3-648cd6f08b11",
"layout": {
@@ -1560,9 +1594,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "0ab67903-16ea-4001-b784-ae04d8b815c0",
"layout": {
@@ -1600,9 +1636,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "bb5dc07d-673b-4e2d-b44c-441acfa7c27b",
"layout": {
@@ -1640,9 +1678,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4cac1498-c141-483f-97c6-e1177317a2ea",
"layout": {
@@ -1695,9 +1735,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5247f393-a934-4d9e-be0f-40b177d2be80",
"layout": {
@@ -1738,9 +1780,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "b87c56f7-4e50-4d15-8bcd-1218fee879d9",
"layout": {
@@ -1781,9 +1825,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ae2d0a7a-b6cd-4fd5-99d4-3c4289b8b5a8",
"layout": {
@@ -1824,9 +1870,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "78e4badc-8d51-4aa6-81c5-d1c9183810a2",
"layout": {
@@ -1867,9 +1915,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "296b43f1-2f33-492a-bce8-6f0fde1e7b52",
"layout": {
@@ -1924,9 +1974,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "1537acaa-d5ce-48c5-b740-26fd543eb120",
"layout": {
@@ -1964,9 +2016,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a1c34fa4-4549-41a6-8d31-d25e7d860106",
"layout": {
@@ -2031,4 +2085,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -665,9 +665,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ee0c56e0-8f8e-4cbe-ac41-de2afad7b75a",
"layout": {
@@ -710,9 +712,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5c361278-8a94-4b16-afdd-e6def804b9ff",
"layout": {
@@ -755,10 +759,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -812,10 +816,10 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"gradientMode": "none",
"fillOpacity": 0.3,
"gradientMode": "opacity",
"lineInterpolation": "smooth",
"lineWidth": 1,
"lineWidth": 2,
"scaleDistribution": {
"type": "linear"
},
@@ -869,9 +873,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a0096936-3790-40a1-b2ad-d7805945b948",
"layout": {
@@ -927,9 +933,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45aafb11-c694-4686-89ab-685068f91560",
"layout": {
@@ -967,9 +975,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "09ca6329-8eec-4a61-b19e-9bbeea2b9712",
"layout": {
@@ -1025,9 +1035,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "6c0d9b3c-dda5-4da9-825e-33f650dbb008",
"layout": {
@@ -1067,9 +1079,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4f7ce5a7-2771-4cbf-a569-b1a90b070b93",
"layout": {
@@ -1127,9 +1141,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "e98839c4-e3f3-4e6e-be3a-c44b70e6072c",
"layout": {
@@ -1167,9 +1183,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "45c4e3d9-90f1-41bd-8169-1d8c0a921ba9",
"layout": {
@@ -1207,9 +1225,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "3b2a922d-4423-4845-8cfc-95970f3300d6",
"layout": {
@@ -1247,9 +1267,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "764fbcf7-3056-41ef-b62a-51813a6c315f",
"layout": {
@@ -1287,9 +1309,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "7cc04ae4-946d-4837-9ea9-764a7cc2eecd",
"layout": {
@@ -1345,9 +1369,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ad0445b0-8539-440d-bbf4-712450132a7a",
"layout": {
@@ -1385,9 +1411,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "c3cf6c57-c4ce-4bc2-a150-df32c4951144",
"layout": {
@@ -1425,9 +1453,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "022db454-70ba-49f5-8c11-f89b76d145cb",
"layout": {
@@ -1465,9 +1495,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "f20bad4f-656c-428a-a1cf-aafb7d92137c",
"layout": {
@@ -1520,9 +1552,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "cefafeb9-fc8a-4c73-92b3-648cd6f08b11",
"layout": {
@@ -1560,9 +1594,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "0ab67903-16ea-4001-b784-ae04d8b815c0",
"layout": {
@@ -1600,9 +1636,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "bb5dc07d-673b-4e2d-b44c-441acfa7c27b",
"layout": {
@@ -1640,9 +1678,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "4cac1498-c141-483f-97c6-e1177317a2ea",
"layout": {
@@ -1695,9 +1735,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5247f393-a934-4d9e-be0f-40b177d2be80",
"layout": {
@@ -1738,9 +1780,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "b87c56f7-4e50-4d15-8bcd-1218fee879d9",
"layout": {
@@ -1781,9 +1825,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "ae2d0a7a-b6cd-4fd5-99d4-3c4289b8b5a8",
"layout": {
@@ -1824,9 +1870,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "78e4badc-8d51-4aa6-81c5-d1c9183810a2",
"layout": {
@@ -1867,9 +1915,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "296b43f1-2f33-492a-bce8-6f0fde1e7b52",
"layout": {
@@ -1924,9 +1974,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "1537acaa-d5ce-48c5-b740-26fd543eb120",
"layout": {
@@ -1964,9 +2016,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "a1c34fa4-4549-41a6-8d31-d25e7d860106",
"layout": {
@@ -2031,4 +2085,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -640,9 +640,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "GC运行次数",
"id": "f39502b5-a6a8-4bed-93d7-be83096eecbf",
@@ -680,9 +682,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "GC运行耗时",
"id": "df97e013-e810-4b78-8253-0a1fe7c96b3a",
@@ -735,9 +739,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "translog大小byte",
"id": "47583195-3a48-4d76-8b36-c08c29be936e",
@@ -777,9 +783,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "translog大小byte",
"id": "dca13d7f-90ca-4302-afed-753c2c181cf5",
@@ -832,9 +840,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "节点断路器阻断总数",
"id": "7040d182-228f-4a58-b4ce-1eb4addeb88f",
@@ -872,9 +882,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "预估内存大小和限制内存大小",
"id": "31d1efe8-d58a-4f1c-b510-1854ec1f491a",
@@ -932,9 +944,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "1m/5m/15m系统负载",
"id": "1295b795-0e8a-4db7-afc1-5248e386062d",
@@ -982,9 +996,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "进程CPU占比",
"id": "356d363a-682b-41f9-9fdd-7212e943fc49",
@@ -1024,9 +1040,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "进程内存占用/限制/峰值byte",
"id": "f0216c7e-ade7-47c0-aec1-6efab9543e58",
@@ -1076,9 +1094,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "JVM申请/限制内存byte",
"id": "12bce6cc-a0fc-4e98-ba19-5cf5fdeb6332",
@@ -1136,9 +1156,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "磁盘使用率",
"id": "5de089e7-c5cd-4a01-9cd7-70e39feef131",
@@ -1178,9 +1200,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "网络流量byte",
"id": "957402f9-2e17-4c67-8d6b-02a8cc6789d9",
@@ -1238,9 +1262,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "节点文档总数,不包含已删除文档和子文档以及刚索引的文档",
"id": "6220138b-3452-4529-a008-c78e20672169",
@@ -1278,9 +1304,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "平均每秒索引文档数",
"id": "242dff44-09b1-4468-856d-642e76048296",
@@ -1318,9 +1346,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "平均每秒删除文档数",
"id": "400efbe3-a4c5-49af-a0bf-eabf2511ebf5",
@@ -1358,9 +1388,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "平均每秒合并文档数",
"id": "0b2d6480-6f50-413f-8552-f49109d2be59",
@@ -1398,9 +1430,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "平均每秒合并文档大小",
"id": "981c2d24-56df-437c-bc43-77682008dd01",
@@ -1453,9 +1487,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "查询操作耗时(秒)",
"id": "e217b136-6021-473a-859e-7ac4218c4e86",
@@ -1495,9 +1531,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "索引操作耗时(秒)",
"id": "d51a4ef1-1fc5-4d1b-ba6c-a2fd483295ee",
@@ -1537,9 +1575,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "合并操作耗时(秒)",
"id": "20751b64-38da-4263-a055-02bc844bd416",
@@ -1579,9 +1619,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "索引存储限制耗时(秒)",
"id": "d688b715-5959-433a-89b2-51bcd2b0b1f3",
@@ -1634,9 +1676,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "9be3061f-ade2-43a5-ab5f-bfdc8861e4be",
"layout": {
@@ -1725,9 +1769,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "55cf0c8e-bf4f-430c-bc68-1eca72d7055d",
"layout": {
@@ -1822,9 +1868,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "线程池reject次数",
"id": "d337f12c-6fbe-4463-9181-faecdc612a90",
@@ -1862,9 +1910,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "活跃线程数",
"id": "1053fab0-f105-4a6b-9508-dc87c4f78956",
@@ -1902,9 +1952,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "排队等待线程任务数量",
"id": "aad51280-5725-4485-841d-c08f0277508f",
@@ -1942,9 +1994,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "线程池complete次数",
"id": "76538cda-67f3-4040-b42e-be27078440e4",
@@ -1995,9 +2049,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "fielddata cache内存占用byte",
"id": "100f8d6d-073b-46f4-a664-db11e889a111",
@@ -2037,9 +2093,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "fielddata cache平均每秒内存剔除次数",
"id": "4af09644-306e-404d-a1a0-174397b26c4e",
@@ -2079,9 +2137,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "query cache内存占用byte",
"id": "e9632f58-8186-43bf-81b1-c57e91078e35",
@@ -2121,9 +2181,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "query cache平均每秒内存剔除次数",
"id": "e1145b0d-b839-4189-bd02-d955ae3dbcf3",
@@ -2163,9 +2225,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "老版本的filter cache内存剔除次数",
"id": "14ce9ebf-5ff7-42da-9628-8746e18fe32b",
@@ -2218,9 +2282,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "segment个数",
"id": "7f3f74ca-a8ca-4d07-b17a-72bb198f9726",
@@ -2258,9 +2324,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "segment内存占用byte",
"id": "0d2bbc28-2211-4097-acbc-e1f72b3cad88",
@@ -2313,9 +2381,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片文档数",
"id": "8620f336-4e26-40db-8c85-6a336a5fb7c9",
@@ -2353,9 +2423,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片索引容量byte",
"id": "d4541f1a-136f-4b3e-b5e9-8cc92267aa8a",
@@ -2395,9 +2467,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片索引容量byte",
"id": "66926f5a-d562-428e-b48b-d69b4d705b8f",
@@ -2450,9 +2524,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片索引写入数据量byte",
"id": "7837ae60-c490-4e8a-a604-133cdeb5a3e7",
@@ -2492,9 +2568,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片索引写入数据量byte",
"id": "8f200ba5-8c9b-4a26-b7b3-307cdb504316",
@@ -2547,9 +2625,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片segment数",
"id": "d20fb2f9-0e51-4bd1-a580-1308349e0b71",
@@ -2587,9 +2667,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片segment总数",
"id": "b8f5151d-d7d9-4cf2-822e-56ce5b0f58b2",
@@ -2627,9 +2709,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片segment容量",
"id": "c6c1eee0-4c93-462e-8c53-f369fee48e46",
@@ -2669,9 +2753,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片segment容量",
"id": "d9b36d80-c753-4bde-8e6d-29af8c5a7e83",
@@ -2724,9 +2810,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片doc value内存占用byte",
"id": "205f362a-ad57-4cb8-ac3f-7afdb5dc87d6",
@@ -2766,9 +2854,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片doc value内存占用byte",
"id": "ea838448-825c-4627-a09d-19db6c1e4a14",
@@ -2821,9 +2911,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "分片field内存占用byte",
"id": "6f8efb01-aac1-427c-bf7b-d6b90a968185",
@@ -2863,9 +2955,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片field内存占用byte",
"id": "b82b390b-8f72-427b-9d1f-37d279f94366",
@@ -2918,9 +3012,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片fixed bit set内存占用byte",
"id": "707cfc5f-cdbe-43dc-9d1f-f79e306ca7ff",
@@ -2960,9 +3056,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片fixed bit set内存占用byte",
"id": "ee949fc8-2c50-4ca3-944f-b42030439968",
@@ -3015,9 +3113,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片normalization factor内存占用byte",
"id": "167f10ca-179d-4dfd-ba1d-e2184be993be",
@@ -3055,9 +3155,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片normalization factor内存占用byte",
"id": "41fba22d-bbb0-4cbd-a8cd-c7910991cecf",
@@ -3108,9 +3210,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片point内存占用byte",
"id": "24e451cb-3835-4172-926b-54a33aa3b9b4",
@@ -3150,9 +3254,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片point内存占用byte",
"id": "79665ebe-5804-4809-af68-15d3a72a2c2c",
@@ -3205,9 +3311,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "主分片term内存占用byte",
"id": "c464e467-a6cf-4d60-8108-fb0359c801d8",
@@ -3247,9 +3355,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片term内存占用byte",
"id": "b0befc26-33c8-44f3-aa3e-80a9ed99180a",
@@ -3302,9 +3412,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片version map内存占用byte",
"id": "a2778c3a-6473-4482-bade-398904922e2f",
@@ -3344,9 +3456,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"description": "所有分片version map内存占用byte",
"id": "322b0c1b-982a-4654-8552-7f246f496480",
@@ -3433,4 +3547,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -0,0 +1,272 @@
[
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health delayed unassigned 的分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_delayed_unassigned_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health Pending task 数量",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_number_of_pending_tasks"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health relocating 的分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_relocating_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health unassigned 的分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_unassigned_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 健康度状态码",
"unit": "none",
"note": "- 1Green绿色状态表示所有分片都正常\n- 2Yellow黄色状态主分片都正常从分片有不正常的\n- 3Red红色状态有些主分片不正常",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_status_code"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 数据节点数量",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_number_of_data_nodes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 正在初始化的分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_initializing_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 活跃主分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_active_primary_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 活跃分片数",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_active_shards"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Cluster Health 节点数量",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_cluster_health_number_of_nodes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Indexing 平均耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_indexing_index_time_in_millis[3m])\n/\nirate(elasticsearch_indices_indexing_index_total[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Merge 平均耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_merges_total_time_in_millis[3m])\n/\nirate(elasticsearch_indices_merges_total[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "Query 平均耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_search_query_time_in_millis[3m])\n/\nirate(elasticsearch_indices_search_query_total[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "每秒 indexing 数量",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_indexing_index_total[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "每秒 merge 大小",
"unit": "bytesSecIEC",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_merges_total_size_in_bytes[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "每秒 merge 数量",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_merges_total_docs[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "每秒删除 doc 数量",
"unit": "sishort",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_indices_docs_deleted[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "硬盘使用率",
"unit": "percent",
"note": "",
"lang": "zh_CN",
"expression": "100 - 100 * elasticsearch_fs_total_available_in_bytes / elasticsearch_fs_total_total_in_bytes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "网络流量 - 入向每秒流量",
"unit": "bytesSecIEC",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_transport_rx_size_in_bytes[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "网络流量 - 出向每秒流量",
"unit": "bytesSecIEC",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_transport_tx_size_in_bytes[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 CPU 使用率",
"unit": "percent",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_process_cpu_percent"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 JVM Heap 使用率",
"unit": "percent",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_jvm_mem_heap_used_percent"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 JVM Heap 区 committed 大小",
"unit": "bytesIEC",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_jvm_mem_heap_committed_in_bytes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 JVM Non Heap 区 committed 大小",
"unit": "bytesIEC",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_jvm_mem_non_heap_committed_in_bytes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 JVM Old 内存池 used 大小",
"unit": "bytesIEC",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_jvm_mem_pools_old_used_in_bytes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程 JVM Young 内存池 used 大小",
"unit": "bytesIEC",
"note": "",
"lang": "zh_CN",
"expression": "elasticsearch_jvm_mem_pools_young_used_in_bytes"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程新生代每秒 GC 次数",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_jvm_gc_collectors_young_collection_count[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程新生代每秒 GC 耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_jvm_gc_collectors_young_collection_time_in_millis[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程老生代每秒 GC 次数",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_jvm_gc_collectors_old_collection_count[3m])"
},
{
"collector": "Categraf",
"typ": "ElasticSearch",
"name": "进程老生代每秒 GC 耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "irate(elasticsearch_jvm_gc_collectors_old_collection_time_in_millis[3m])"
}
]

View File

@@ -317,9 +317,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -389,9 +389,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -472,9 +472,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -630,9 +630,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -697,9 +697,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -708,4 +708,4 @@
}
]
}
}
}

View File

@@ -82,9 +82,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -217,9 +217,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -497,4 +497,4 @@
}
]
}
}
}

View File

@@ -341,9 +341,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -438,9 +438,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -502,9 +502,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -513,4 +513,4 @@
}
]
}
}
}

View File

@@ -242,9 +242,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -309,9 +309,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -454,9 +454,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -516,9 +516,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -665,9 +665,9 @@
"drawStyle": "lines",
"lineInterpolation": "smooth",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.5,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "off",
"scaleDistribution": {
"type": "linear"
@@ -1099,4 +1099,4 @@
}
]
}
}
}

View File

@@ -583,9 +583,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.8,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "normal",
"scaleDistribution": {
"type": "linear"
@@ -656,9 +656,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.7,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "normal",
"scaleDistribution": {
"type": "linear"
@@ -724,9 +724,9 @@
"drawStyle": "lines",
"lineInterpolation": "linear",
"spanNulls": false,
"lineWidth": 1,
"fillOpacity": 0.7,
"gradientMode": "none",
"lineWidth": 2,
"fillOpacity": 0.3,
"gradientMode": "opacity",
"stack": "normal",
"scaleDistribution": {
"type": "linear"
@@ -735,4 +735,4 @@
}
]
}
}
}

View File

@@ -0,0 +1,101 @@
[
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "HTTP 探测响应码",
"unit": "none",
"note": "如果没有拿到 response这个指标就没有值了",
"lang": "zh_CN",
"expression": "http_response_response_code"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "HTTP 探测结果状态码",
"unit": "none",
"note": "0 值表示正常,大于 0 就是异常,各个值的含义如下:\n\n```\nSuccess = 0\nConnectionFailed = 1\nTimeout = 2\nDNSError = 3\nAddressError = 4\nBodyMismatch = 5\nCodeMismatch = 6\n```",
"lang": "zh_CN",
"expression": "http_response_result_code"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "HTTP 探测耗时",
"unit": "seconds",
"note": "",
"lang": "zh_CN",
"expression": "http_response_response_time"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "HTTP 证书过期时间",
"unit": "datetimeSeconds",
"note": "",
"lang": "zh_CN",
"expression": "http_response_cert_expire_timestamp"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - DNS 请求耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "cdn_dns_request"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - TCP建连耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "cdn_tcp_connect"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - TLS握手耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "cdn_tls_handshake"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - 探测结果状态码",
"unit": "none",
"note": "探测结果0 是正常,其他数字有不同含义\n- 0成功\n- 1连接失败\n- 2监测超时\n- 3DNS解析失败\n- 4地址格式错误\n- 5返回内容不匹配\n- 6返回码不匹配\n- 其他数字为未知错误",
"lang": "zh_CN",
"expression": "cdn_probe_result_code"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - 整体耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "cdn_total_cost"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - 返回状态码",
"unit": "none",
"note": "",
"lang": "zh_CN",
"expression": "cdn_response_status_code"
},
{
"collector": "Categraf",
"typ": "HTTP_Response",
"name": "拨测 - 首包耗时",
"unit": "milliseconds",
"note": "",
"lang": "zh_CN",
"expression": "cdn_first_byte"
}
]

View File

@@ -1,43 +1,33 @@
# Read metrics from the bare metal servers via IPMI
# Read metrics from the bare metal servers via freeipmi
[[instances]]
## optionally specify the path to the ipmitool executable
# path = "/usr/bin/ipmitool"
##
## Setting 'use_sudo' to true will make use of sudo to run ipmitool.
## Sudo must be configured to allow the telegraf user to run ipmitool
## without a password.
# use_sudo = false
##
## optionally force session privilege level. Can be CALLBACK, USER, OPERATOR, ADMINISTRATOR
# privilege = "ADMINISTRATOR"
##
## optionally specify one or more servers via a url matching
## [username[:password]@][protocol[(address)]]
## e.g.
## root:passwd@lan(127.0.0.1)
##
## if no servers are specified, local machine sensor stats will be queried
##
# servers = ["USERID:PASSW0RD@lan(192.168.1.1)"]
# target指定是本地采集还是远程采集
#target="localhost"
# 指定采集的用户名和密码这里务必保证ipmi命令能获取正确输出不是网上查到一个用户名 密码就可以。
#user = "user"
#pass = "1234"
## Recommended: use metric 'interval' that is a multiple of 'timeout' to avoid
## gaps or overlap in pulled data
interval = "30s"
# ipmi协议版本支持1.5 和 2.0
#driver = "LAN_2_0"
## Timeout for the ipmitool command to complete. Default is 20 seconds.
timeout = "20s"
# 指定特权用户名
#privilege = "user"
## Schema Version: (Optional, defaults to version 1)
metric_version = 2
## session-timeout, ms
#timeout = 100000
## Optionally provide the hex key for the IMPI connection.
# hex_key = ""
# 支持的采集器 bmc, bmc-watchdog, ipmi, chassis, dcmi, selsm-lan-mode
# 默认使用 bmc, ipmi, chassis和dcmi建议保持下列配置便于仪表盘更好的展示
collectors = [ "bmc", "ipmi", "chassis", "sel", "dcmi"]
## If ipmitool should use a cache
## for me ipmitool runs about 2 to 10 times faster with cache enabled on HP G10 servers (when using ubuntu20.04)
## the cache file may not work well for you if some sensors come up late
# use_cache = false
# 不关注的传感器指定id 排除掉
#exclude_sensor_ids = [ 2, 29, 32, 50, 52, 55 ]
## Path to the ipmitools cache file (defaults to OS temp dir)
## The provided path must exist and must be writable
# cache_path = ""
# 如果你想使用定制化的参数覆盖内置的命令,可以修改以下内容; 建议保持注释
#[instances.collector_cmd]
#ipmi = "sudo"
#sel = "sudo"
#[instances.default_args]
#ipmi = [ "--bridge-sensors" ]
#[instances.custom_args]
#ipmi = [ "--bridge-sensors" ]
#sel = [ "ipmi-sel" ]

File diff suppressed because it is too large Load Diff

View File

@@ -1,153 +1,39 @@
# IPMI plugin
ipmi插件是从ipmi exporter迁移过来。 基本原理是通过执行ipmi的一系列命令并将命令输出转换为指标如果ipmi没有配置好是无法采集到指标的请务必将ipmi配置好。
利用 `ipmitool sdr` 命令, 采集硬件的温度、功率、电压等信息,并转化为指标。 依赖工具 `ipmitool`,所以需要安装`ipmitool`
## IPMI 配置
```bash
# 此处的主机必须支持ipmi bmc不然openipmi启动不了
# Ubuntu
apt install openipmi ipmitool
# Centos
yum install OpenIPMI ipmitool
# 加载模块
modprobe ipmi_msghandler
modprobe ipmi_devintf
modprobe ipmi_si
modprobe ipmi_poweroff
modprobe ipmi_watchdog
# 此处有一点一定要注意如果不是真实的服务器的话在加载ipmi_si的时候会报错因为在虚拟化中使用虚拟机测试安装完成以后ipmi_si模块无法加载。
lsmod |grep ^ipmi
ipmi_watchdog 28672 0
ipmi_poweroff 16384 0
ipmi_ssif 32768 0
ipmi_si 61440 1
ipmi_devintf 20480 0
ipmi_msghandler 102400 5 ipmi_devintf,ipmi_si,ipmi_watchdog,ipmi_ssif,ipmi_poweroff
# 配置ipm访问在目标主机我这里是server01做实例。
ipmitool user list 1 # 查看当前的用户列表
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
1 true false false NO ACCESS
2 root true true true ADMINISTRATOR
3 true false false NO ACCESS
4 true false false NO ACCESS
5 true false false NO ACCESS
6 true false false NO ACCESS
7 true false false NO ACCESS
8 true false false NO ACCESS
9 true false false NO ACCESS
10 true false false NO ACCESS
# 设置ID 3 为 user为 test 密码 test
ipmitool user set name 3 test
ipmitool user set password 3 test
ipmitool user enable 3
# 验证
ipmitool user list 1
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
1 true false false NO ACCESS
2 root true true true ADMINISTRATOR
3 test true false false NO ACCESS
4 true false false NO ACCESS
5 true false false NO ACCESS
6 true false false NO ACCESS
7 true false false NO ACCESS
8 true false false NO ACCESS
9 true false false NO ACCESS
10 true false false NO ACCESS
# privilege value1 callback 2 user 3 operator 4 administrator 5 OEM
# 设置用户test权限 channel 为 1user ID 为 3privilege 为 4
ipmitool channel setaccess 1 3 callin=on ipmi=on link=on privilege=4
# 验证权限
ipmitool channel getaccess 1 3
Maximum User IDs : 10
Enabled User IDs : 1
User ID : 3
User Name : test
Fixed Name : No
Access Available : call-in / callback
Link Authentication : enabled
IPMI Messaging : enabled
Privilege Level : ADMINISTRATOR
Enable Status : disabled
ipmitool user list 1
# 再次使用ipmitool user list 1验证
ipmitool user list 1
ID Name Callin Link Auth IPMI Msg Channel Priv Limit
1 true false false NO ACCESS
2 root true true true ADMINISTRATOR
3 test true true true ADMINISTRATOR
4 true false false NO ACCESS
5 true false false NO ACCESS
6 true false false NO ACCESS
7 true false false NO ACCESS
8 true false false NO ACCESS
9 true false false NO ACCESS
10 true false false NO ACCESS
# OK针对网络做下配置注意主机的网段与子网掩码
ipmitool lan set 1 ipaddr 192.168.1.229
ipmitool lan set 1 netmask 255.255.252.0
ipmitool lan set 1 defgw ipaddr 192.168.1.123
ipmitool lan set 1 access on
# 验证网络配置
ipmitool lan print 1
IP Address Source : Static Address
IP Address : 192.168.1.227
Subnet Mask : 255.255.252.0
MAC Address : xx:xx:52:xx:xx:81
SNMP Community String : public
```
## 采集配置
categraf 的 `conf/input.ipmi/conf.toml`
categraf的ipmi插件配置举例如下
```toml
# Read metrics from the bare metal servers via freeipmi
[[instances]]
## optionally specify the path to the ipmitool executable
# path = "/usr/bin/ipmitool"
##
## Setting 'use_sudo' to true will make use of sudo to run ipmitool.
## Sudo must be configured to allow the telegraf user to run ipmitool
## without a password.
# use_sudo = false
##
## optionally force session privilege level. Can be CALLBACK, USER, OPERATOR, ADMINISTRATOR
# privilege = "ADMINISTRATOR"
##
## optionally specify one or more servers via a url matching
## [username[:password]@][protocol[(address)]]
## e.g.
## root:passwd@lan(127.0.0.1)
##
## if no servers are specified, local machine sensor stats will be queried
##
servers = ["ADMIN:1234567@lan(192.168.1.123)"]
# target指定是本地采集还是远程采集
#target="localhost"
# 指定采集的用户名和密码这里务必保证ipmi命令能获取正确输出不是网上查到一个用户名 密码就可以。
#user = "user"
#pass = "1234"
## Recommended: use metric 'interval' that is a multiple of 'timeout' to avoid
## gaps or overlap in pulled data
interval = "30s"
# ipmi协议版本支持1.5 和 2.0
#driver = "LAN_2_0"
## Timeout for the ipmitool command to complete. Default is 20 seconds.
timeout = "20s"
# 指定特权用户名
#privilege = "user"
## Schema Version: (Optional, defaults to version 1)
metric_version = 2
## session-timeout, ms
#timeout = 100000
## Optionally provide the hex key for the IMPI connection.
# hex_key = ""
# 支持的采集器 bmc, bmc-watchdog, ipmi, chassis, dcmi, selsm-lan-mode
# 默认使用 bmc, ipmi, chassis和dcmi建议保持下列配置便于仪表盘更好的展示
collectors = [ "bmc", "ipmi", "chassis", "sel", "dcmi"]
## If ipmitool should use a cache
## for me ipmitool runs about 2 to 10 times faster with cache enabled on HP G10 servers (when using ubuntu20.04)
## the cache file may not work well for you if some sensors come up late
# use_cache = false
# 不关注的传感器指定id 排除掉
#exclude_sensor_ids = [ 2, 29, 32, 50, 52, 55 ]
## Path to the ipmitools cache file (defaults to OS temp dir)
## The provided path must exist and must be writable
```
## 仪表盘效果
夜莺内置了 IPMI 的仪表盘和告警规则,克隆到自己的业务组下即可使用。
![ipmi](http://download.flashcat.cloud/uPic/ipmi.png)
# 如果你想使用定制化的参数覆盖内置的命令,可以修改以下内容; 建议保持注释
#[instances.collector_cmd]
#ipmi = "sudo"
#sel = "sudo"
#[instances.default_args]
#ipmi = [ "--bridge-sensors" ]
#[instances.custom_args]
#ipmi = [ "--bridge-sensors" ]
#sel = [ "ipmi-sel" ]
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

View File

@@ -181,9 +181,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5455e2f2-f6bb-4888-9d88-240d7e12cce2",
"layout": {
@@ -228,9 +230,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "765b22a9-1ddc-4c08-8758-684e3c13252b",
"layout": {
@@ -288,9 +292,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5ab2434c-a905-43c1-a563-4cee2dc9dce9",
"layout": {
@@ -340,9 +346,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "bfe16d07-91ff-44e6-87bc-9d5d93d2ebd6",
"layout": {
@@ -392,9 +400,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "18d10f97-5ab2-41c4-a3ad-09f2c7a03e1a",
"layout": {
@@ -444,9 +454,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "314a3893-c1d4-4f85-bce0-33ecfda2f521",
"layout": {
@@ -496,9 +508,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "1e5f03e7-af5d-447b-9c1b-23d81915e8df",
"layout": {
@@ -548,9 +562,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "86a68ff6-238c-4fc9-b77e-3b964e564500",
"layout": {
@@ -600,9 +616,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "595af7d1-e53c-43b5-8f62-ddb9b3a4ffcb",
"layout": {
@@ -652,9 +670,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "380fdfcb-16a6-4131-abaa-a3911b7de6fa",
"layout": {
@@ -717,9 +737,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5303bda0-47c2-4aca-bb12-1da512500f4a",
"layout": {
@@ -757,9 +779,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "cf410459-b5df-4aca-a410-ecda091d6097",
"layout": {
@@ -798,8 +822,10 @@
{
"custom": {
"drawStyle": "bars",
"fillOpacity": 1,
"stack": "off"
"fillOpacity": 0.3,
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "30feb928-b7c3-4e71-aeeb-cc10994b313c",
"layout": {
@@ -851,9 +877,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "65c74a2b-5f01-4491-b45a-dffe4a9b678a",
"layout": {
@@ -900,9 +928,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "2da16907-adf7-4561-9338-4254c89a311b",
"layout": {
@@ -951,9 +981,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "5a859147-edfc-4dac-9457-8a928213bc00",
"layout": {
@@ -1028,4 +1060,4 @@
],
"version": "3.0.0"
}
}
}

View File

@@ -176,9 +176,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "c2ec4036-3081-45cc-b672-024c6df93833",
"layout": {
@@ -214,9 +216,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "7ad651a6-c12c-4d46-8d01-749fa776faef",
"layout": {
@@ -252,9 +256,11 @@
{
"custom": {
"drawStyle": "lines",
"fillOpacity": 0.5,
"fillOpacity": 0.3,
"lineInterpolation": "smooth",
"stack": "off"
"stack": "off",
"lineWidth": 2,
"gradientMode": "opacity"
},
"id": "855aa8f5-0c51-42d4-b9a4-5460b7cd0f5a",
"layout": {
@@ -394,4 +400,4 @@
],
"version": "3.0.0"
}
}
}

Some files were not shown because too many files have changed in this diff Show More