mirror of
https://github.com/ccfos/nightingale.git
synced 2026-03-10 01:49:19 +00:00
Compare commits
88 Commits
password-e
...
refactor-b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cbcd2a0ca1 | ||
|
|
3f865e2d19 | ||
|
|
e3ea65d098 | ||
|
|
93159f07fd | ||
|
|
7d410baa2d | ||
|
|
20b30c3e2c | ||
|
|
8805bf6598 | ||
|
|
fe6a64dae8 | ||
|
|
2c564a2c58 | ||
|
|
ae3c13224d | ||
|
|
9a4015f13f | ||
|
|
274ca09551 | ||
|
|
3d9b4fc14e | ||
|
|
07436a5e0d | ||
|
|
f7b2f1acb9 | ||
|
|
4f4287030a | ||
|
|
e25e712c48 | ||
|
|
66951d7e77 | ||
|
|
f5ff27cd18 | ||
|
|
9e3f6e6285 | ||
|
|
48e3df2cb4 | ||
|
|
ac5d69dba4 | ||
|
|
597351c424 | ||
|
|
1f6b2e341a | ||
|
|
035752ace2 | ||
|
|
60a1437207 | ||
|
|
e31414bc8c | ||
|
|
785a294845 | ||
|
|
98933eee34 | ||
|
|
20905810d7 | ||
|
|
c1bde83639 | ||
|
|
782a0e9616 | ||
|
|
6a3720bc8b | ||
|
|
de252359d6 | ||
|
|
deb313ca3d | ||
|
|
d119de56be | ||
|
|
f05417fa23 | ||
|
|
9ab2eb591f | ||
|
|
3f476d770f | ||
|
|
ced6759686 | ||
|
|
eba3014c59 | ||
|
|
3aeb4e16e9 | ||
|
|
3b62722251 | ||
|
|
fb1cc4868e | ||
|
|
4a0dcf0dbf | ||
|
|
4f913f146e | ||
|
|
533560f432 | ||
|
|
cf7b479a1b | ||
|
|
2e4c29a0de | ||
|
|
6f0ceb94c6 | ||
|
|
800d7ba04b | ||
|
|
fb6a6d2b93 | ||
|
|
cf2b19ae90 | ||
|
|
fb1cc93613 | ||
|
|
c2bba796c2 | ||
|
|
a02bf83842 | ||
|
|
cd9f129e2d | ||
|
|
e85c80bdcf | ||
|
|
7e83e0c482 | ||
|
|
92ac3125f3 | ||
|
|
a61feca369 | ||
|
|
8b0b811919 | ||
|
|
8742526c7f | ||
|
|
ee757cfd92 | ||
|
|
b12cfea379 | ||
|
|
45365e3e03 | ||
|
|
1b676eefd2 | ||
|
|
0092dc44fd | ||
|
|
4941b376f3 | ||
|
|
e46813cd17 | ||
|
|
58ebd224c2 | ||
|
|
95ece6e16f | ||
|
|
b82cbd06fa | ||
|
|
16210892da | ||
|
|
a452d63a56 | ||
|
|
51c7abedd3 | ||
|
|
6d0a2420a8 | ||
|
|
9cf687b73d | ||
|
|
49c9e41df5 | ||
|
|
2ec2e64213 | ||
|
|
867a61c8dc | ||
|
|
12263d1453 | ||
|
|
c0cacb2e64 | ||
|
|
0637b343b1 | ||
|
|
2473e144ef | ||
|
|
00a37d6de7 | ||
|
|
50c664e6bf | ||
|
|
22b7d20455 |
44
README.md
44
README.md
@@ -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集成,确保告警处理不遗漏,减少打扰,高效协同。
|
||||
|
||||
|
||||
## 功能演示
|
||||

|
||||
## 截图演示
|
||||
|
||||
## 部署架构
|
||||
<p align=center>中心化部署</p>
|
||||
即时查询,类似 Prometheus 内置的查询分析页面,做 ad-hoc 查询,夜莺做了一些 UI 优化,同时提供了一些内置 promql 指标,让不太了解 promql 的用户也可以快速查询。
|
||||
|
||||

|
||||

|
||||
|
||||
<p align=center>多机房部署</p>
|
||||
当然,也可以直接通过指标视图查看,有了指标视图,即时查询基本可以不用了,或者只有高端玩家使用即时查询,普通用户直接通过指标视图查询即可。
|
||||
|
||||

|
||||

|
||||
|
||||
夜莺内置了常用仪表盘,可以直接导入使用。也可以导入 Grafana 仪表盘,不过只能兼容 Grafana 基本图表,如果已经习惯了 Grafana 建议继续使用 Grafana 看图,把夜莺作为一个告警引擎使用。
|
||||
|
||||

|
||||
|
||||
除了内置的仪表盘,也内置了很多告警规则,开箱即用。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
## 产品架构
|
||||
|
||||
社区使用夜莺最多的场景就是使用夜莺做告警引擎,对接多套时序库,统一告警规则管理。绘图仍然使用 Grafana 居多。作为一个告警引擎,夜莺的产品架构如下:
|
||||
|
||||

|
||||
|
||||
对于个别边缘机房,如果和中心夜莺服务端网络链路不好,希望提升告警可用性,我们也提供边缘机房告警引擎下沉部署模式,这个模式下,即便网络割裂,告警功能也不受影响。
|
||||
|
||||

|
||||
|
||||
## 交流渠道
|
||||
- 报告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)
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
228
center/integration/init.go
Normal 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
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
66
center/router/router_builtin_componet.go
Normal file
66
center/router/router_builtin_componet.go
Normal 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))
|
||||
}
|
||||
120
center/router/router_builtin_metric_filter.go
Normal file
120
center/router/router_builtin_metric_filter.go
Normal 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
|
||||
}
|
||||
113
center/router/router_builtin_metrics.go
Normal file
113
center/router/router_builtin_metrics.go
Normal 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))
|
||||
}
|
||||
91
center/router/router_builtin_payload.go
Normal file
91
center/router/router_builtin_payload.go
Normal 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))
|
||||
}
|
||||
@@ -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 == "" {
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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"`
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
12
conf/conf.go
12
conf/conf.go
@@ -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)
|
||||
|
||||
|
||||
@@ -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"]
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
@@ -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"
|
||||
@@ -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
|
||||
@@ -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"
|
||||
@@ -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';
|
||||
@@ -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
@@ -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;
|
||||
@@ -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"
|
||||
@@ -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
12
go.mod
@@ -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
42
go.sum
@@ -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=
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
272
integrations/ElasticSearch/metrics/categraf-base.json
Normal file
272
integrations/ElasticSearch/metrics/categraf-base.json
Normal 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": "- 1:Green,绿色状态,表示所有分片都正常\n- 2:Yellow,黄色状态,主分片都正常,从分片有不正常的\n- 3:Red,红色状态,有些主分片不正常",
|
||||
"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])"
|
||||
}
|
||||
]
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 @@
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
101
integrations/HTTP_Response/metrics/categraf.json
Normal file
101
integrations/HTTP_Response/metrics/categraf.json
Normal 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- 3:DNS解析失败\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"
|
||||
}
|
||||
]
|
||||
@@ -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, sel,sm-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
@@ -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 value:1 callback 2 user 3 operator 4 administrator 5 OEM
|
||||
# 设置用户test权限 channel 为 1,user ID 为 3,privilege 为 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, sel,sm-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 的仪表盘和告警规则,克隆到自己的业务组下即可使用。
|
||||
|
||||

|
||||
# 如果你想使用定制化的参数覆盖内置的命令,可以修改以下内容; 建议保持注释
|
||||
#[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 |
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user