Code Monkey home page Code Monkey logo

autohomecorp / frostmourne Goto Github PK

View Code? Open in Web Editor NEW
1.3K 40.0 296.0 64.08 MB

Frostmourne(霜之哀伤监控平台)是基于Elasticsearch, Prometheus, SkyWalking, InfluxDB,Mysql/TiDB,ClickHouse, SqlServer, IoTDB数据的分布式监控报警系统. Monitor & alert & alarm for Elasticsearch,Prometheus data。主要使用springboot2 + vue-element-admin

Home Page: https://frostmourne-demo.github.io

License: MIT License

Java 71.79% HTML 0.04% JavaScript 11.98% Vue 15.16% Shell 0.22% SCSS 0.80%
elasticsearch elastalert monitor logging springboot2 alert alarm vue-element-admin vue element-ui

frostmourne's Introduction

GitHub release GitHub Stars GitHub Forks GitHub Contributors GitHub issues JDK support LICENSE Downloads

Github地址 | Gitee地址 | 中文 | English

📖 介绍

Frostmourne(霜之哀伤)是汽车之家经销商技术部监控系统的开源版本,用于帮助监控几乎所有数据库数据(包括Elasticsearch, Prometheus, SkyWalking, MySql 等等)。如果你已经建立起了日志系统, 指标体系,却苦恼于没有一个配套监控系统,也许它能帮到你。使用本系统得当,至少可以做到线上应用出了什么问题,相关开发能第一时间了解报错情况,知道问题出在哪里, 可以快速响应处理,几乎先于所有人知道线上的情况,也因为心中有数所以可以从容应对各种问询,一点都不慌,你们团队值得拥有。

项目初衷

在用ELK建立起日志系统之后,我们发现应用日志监控这块除了ElastAlert之外,没有其他方案。我们初期使用ElastAlert来解决日志监控的问题, 但是随着配置的增加,不仅管理成本和使用成本较高,稳定性方面也不能让我们满意,所以为了更好的易用性,稳定性,我们决定自己做一套简单的监控系统, 来解决日志监控的问题。

项目并不局限于Elasticsearch数据,还支持HTTP, PING, Telnet监控,Prometheus, SkyWalking, InfluxDBMySQL, ClickHouse, IoTDB, SqlServer数据监控, 后面还会加入更多的常用数据源(如:Loki, MongoDB, Redis, Oracle 等)纳入监控范畴,需要做的东西还有很多,需要更多相关开发加入进来,欢迎联系我们,一起做大做强。

✨ 主要功能

  • 只需要写一条数据查询就可以轻松搞定监控

  • 多种数据源支持:Elasticsearch, HTTP, SkyWalking, Prometheus, InfluxDB, MySQL/TiDb, ClickHouse, SqlServer, PING, IotDB, Telnet

  • 数值计算类型监控:count, min, max, avg, sum, unique count, percentiles, standard deviation; Elasticsearch数据支持分桶

  • 多种报警消息发送方式:钉钉(机器人)、企业微信(机器人)、飞书机器人、Email、短信、HTTP

  • 多种消息格式:text, markdown

  • 灵活的报警消息Freemarker模板定制,支持变量占位符;消息模板管理

  • 分布式调度实现,每个监控都是独立调度,互不影响

  • 报警消息附带日志查询短链接,直达报警原因

  • 数值同比,环比监控

  • HTTP数据监控, Javascript表达式判断是否报警; PING连通监控, Telnet端口连通监控

  • 前端简单易用:监控管理、测试、另存、执行日志和历史消息

  • Elasticsearch数据查询、分享和下载

  • 报警消息抑制功能,防止消息轰炸;也有报警升级功能,避免故障相关方长时间得不到通知。

  • 自带账号,团队,部门信息管理模块,也可自己实现内部对接

  • 集成LDAP登录认证

  • 权限控制,数据隔离,各团队互不影响

    企业微信机器人报警截图展示: (查看完整功能截图展示

目录

💻 在线demo

为了更快的理解本项目的作用,提供了一个接口全mock的静态站点供大家预览功能: 在线demo 在线demo更新不及时,请以项目实际运行效果为准,demo只是用于快速浏览

📦 快速启动

提供docker-compose方式,让你更快运行起来便于更好理解项目作用。详细请看文档:Quick-Start

🧰 部署

预备环境准备:MySQL数据库表创建

Frostmourne所有表的创建语句都在 frostmourne.sql 文件中。

数据库密码默认使用明文,没有加密策略。如果你需要对密码进行加密,请参考druid官方文档:druid数据库密码加密

一、k8s部署方式

k8s部署参考以下三个配置文件

相关参数在 frostmourne-monitor-deployment.yaml 文件里配置。需要注意的是在frostmourne-monitor-service.yaml里指定对外映射端口,默认nodePort=30054

kubectl applt -f frostmourne-monitor-namespace.yaml
kubectl applt -f frostmourne-monitor-deployment.yaml
kubectl apply -f frostmourne-monitor-service.yaml

二、zip包部署方式

依赖环境

  • JDK 1.8
  • MySQL 5.7.8+

最新的Release版本zip包,请到 releases 中下载,解压后然后根据自己的环境修改应用配置文件application.properties文件和环境变量配置文件env,然后执行如下命令启动:

./scripts/startup.sh

执行如下命令停止应用:

./scripts/shutdown.sh

三、自构建部署方式

依赖环境

  • JDK 1.8
  • Maven 3.2.x+
  • MySQL 5.7.8+

在项目frostmourne主目录下执maven构建命令:

mvn -U clean package -DskipTests=true

前端项目frostmourne-vue会自动把资源构建到frostmourne-monitorresources/dist下,所以你只需要部署frostmourne-monitor即可。

frostmourne-monitor已经配置了assembly打包,target目录下会生成zip包,你只需要将zip包解压,然后根据自己的 环境修改应用配置文件application.properties文件和环境变量配置文件env,然后执行如下命令启动:

./scripts/startup.sh

执行如下命令停止应用:

./scripts/shutdown.sh

📚 功能使用指南

Elasticsearch数据监控指南 HTTP监控使用说明 Prometheus数据监控指南
SkyWalking数据监控指南 MySQL/TiDB数据监控指南 ClickHouse数据监控指南
InfluxDB数据监控指南 PING监控指南 数值同比监控使用指南
消息模板配置 报警发送 报警抑制
用户管理和登录认证 注意事项 其他
数值环比监控使用指南 iotdb数据监控使用指南 telnet端口连通监控指南

🛠 开发调试

调试环境要求

  • JDK 8 ~ 14
  • Node 16.14.2 (推荐)
  • Yarn 1.22.10 (推荐) 或 Npm 8.7.0
  • MySQL 5.7.8+
  • Elasticsearch 6.3.2+

启动frostmourne-monitor项目, 启动参数增加:

-Dmysql.host=localhost -Dmysql.user=root -Dmysql.password=example -Dlog.console.level=INFO

MySQL相关参数修改为自己环境的,active profile设置为local, 测试地址: http://localhost:10054 使用VS Code打开frostmourne-vue目录,进行前端调试。执行如下命令:

# install dependency
yarn install

# 建议不要直接使用 cnpm 安装以来,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题
yarn install --registry=https://registry.npm.taobao.org

# develop
yarn dev

会自动打开: http://localhost:9528

搭建本地开发调试环境或者需要做二次开发遇到什么困难的都可以加群沟通,欢迎各路英雄多多PR

技术说明项目基于Java8实现,详细请看:技术说明

⚙后续规划

  • 发布1.0-RELEASE
  • 增加本项目内程序日志采集至MySQL并提供查询页面,方便排查问题和监控
  • Elasticsearch数据名增加kibana链接配置,在数据查询页面增加kibana地址跳转链接,方便将数据查询切换至kibana
  • 短信报警方式实现,默认用阿里云短信实现
  • 增加阿里云日志数据监控
  • 增加腾讯云日志数据监控
  • 增加华为云日志数据监控
  • 完成英语国际化
  • 增加 loki 数据监控报警
  • 增加邮箱在线配置页面功能
  • 增加企业微信在线配置页面功能
  • 将短链接id以16进制格式展示,解决id数字很大的时候较长的问题
  • pom优化
  • 员工换组增加是否迁移监控至新组的选项,如果勾选将该员工创建的监控也转移至新组
  • 增加报警组支持
  • Elasticsearch数据名增加traceid字段配置,可以配置跳转链接。例如: 配置skywalking的链接将跳转到skywalking对应的调用链
  • 增加时序数据历史数据比较规则
  • 监控增加报警消息允许发送时间段设置,非允许发送时间段内消息将只记录不发送,发送状态为FORBID
  • 增加企业钉钉发消息默认实现(本地没有环境,需要帮助,欢迎PR,或者提供示例代码,先行谢过)
  • 更多报警方式补充(欢迎PR)
  • 增加 skywalking Database Layer 数据监控报警支持
  • 监控列表增加一个开关选项,只显示我的监控
  • Elasticsearch数据名配置时自动提示索引名称
  • 引入对象迭代器,迭代器代表从数据源中得到一个List数据列表,或者自定义输入;用于动态生成监控查询语句,例如: Level: ERROR AND Project: ${ITEM_VALUE};达到数据遍历监控的效果;
  • 发布1.0-RELEASE
  • 3-sigma离群点检测报警规则
  • 加入时序数据异常检测算法规则(需要实验可行性 基于时间序列的异常检测)
  • 总结项目用到的知识点

👍 致谢

👷 Contributors

@menong-chen @fox2zz @xyzj91 @wxmclub @Aping @limbo

GitHub Contributors

💡️ 如何参与贡献

如果你觉得这个项目对你有所帮助想有所回馈,非常欢迎参与贡献。可以通过如下方式:

  • 从后续规划里选择合适的任务提交PR
  • 对文档进行必要补充
  • 部署本项目使用起来并通过 githubgitee 告知
  • 帮忙扩散推广
  • issue 提出你的宝贵建议
  • 加入交流群,解答交流问题。群内会不定时发布项目更新说明
  • 开源不易,star鼓励
  • 代码规范说明

💬 联系我们

有问题需要帮助或者交流可以添加下边的微信群或QQ群,请优先选择提 issue ,便于问题的讨论和记录追踪,也方便有类似问题的伙伴搜索解决。也欢迎对项目感兴趣的同僚加群交流。 特别提一下:关于文档觉得哪里写的不通畅,不好理解,或者有哪方面缺失,都欢迎提 issue

📌 项目事记

  • 2019-12-16: 发布github
  • 2020-06-14: 发布gitee
  • 2020-07-02: 合并第一个PR
  • 2020-07-04: 被elastic中文社区收录 Elastic日报988期
  • 2020-07-13: github项目设置为私有,丢失82个star,29个fork
  • 2020-07-15: 重新公开github
  • 2020-08-23: 上gitee推荐
  • 2020-08-27: gitee star破百
  • 2020-10-12: github star破百

👥 已注册使用者

通过 githubgitee 登记的使用者

汽车之家 最右APP 家家悦 阳光电源 ETCP LingoAce
叮当快药 爱库存

⭐️ Stargazers over time

Stargazers over time

frostmourne's People

Contributors

dependabot[bot] avatar fangpeng-lingoace avatar huaqiu2022 avatar limboinf avatar littleshrimp1987 avatar wuaping avatar wxmclub avatar xyzj91 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

frostmourne's Issues

希望支持按指定字段进行分组Count功能

现在监控的数据配置里,聚合类型指定为count时,就无法再指定聚合字段。(指定其他聚合类型时,就可以指定聚合字段)。
无法满足一次监控多个动态桶的聚合指标是否异常的需求。

希望修改一下,允许按指定聚合字段进行分组count,并进行指标判断和告警。

提两个小建议

1、如果事件发生的时间是21点到早上6点,非紧急告警可以只做记录,而非直接推送。
2、获取到告警消息后 支持告警的分组处理,比如 获取到service.name,发给相关的负责人

火狐浏览器兼容问题

目前时间类型的字段在火狐浏览器里面会出现无法正常展示的问题,希望能够在后面的版本中进行修复

frostmoure如何配置AWS_ES作为数据源

java.lang.NumberFormatException: For input string: ""//vpc-oregon-elk-es.xxxxxxxxxxxxx.us-west-2.es.amazonaws.com"
1.配置ES数据源是否只能通过:地址+端口形式(127.0.0.1:91200),现在使用AWS_ES地址(服务地址:https//vpc-oregon-elk-es.xxxxxxxxxxxxx.us-west-2.es.amazonaws.com)配置数据源出现以上错误
2.使用地址+端口形式(vpc-oregon-elk-es.xxxxxxxxxxxxx.us-west-2.es.amazonaws.com:443)但由于AWS_ES服务现在原因出现400,AWS_ES服务不支持http请求请问如何
请教一下需要如何进行正确配置

当数据源为多层json时,[数据查询]中部分字段会显示为undefined

[简述你的问题]

当数据为多层json时,[数据查询]中部分字段会显示为undefined

使用版本

[请提供你使用的frostmourne版本]
master:6452c52

具体表现[截图可能会更好些,最好能截全]

数据查询——>当数据源为多层json格式
例如:

{
    "@timestamp": "2020-07-08T12:40:04.712Z",
    "architecture": "x86_64",
    "os": {
        "kernel": "6.1.7601.24545 (win7sp1_ldr_escrow.200102-1707)",
        "build": "7601.24544",
        "platform": "windows",
        "version": "6.1",
        "family": "windows",
        "name": "Windows Server 2008 R2 Enterprise"
    }
}

其中的 os 字段在表格中会显示为 undefined,数据展开后显示正常

@timestamp architecture os
2020-07-08T12:40:04.712Z x86_64 undefined

[注:] 完成后请关闭 issue

配置告警项提示问题

配置告警项的时候,没有任务提示或提示比较隐蔽,一眼看不出来配置的有没有问题

提一条关于恢复告警的小建议

能否支持单独的查询项来确定告警是否恢复。因为有些服务的告警日志是重要且偶发的,服务日志可以定义相应的关键字来确定服务状态是否恢复。望采纳(●'◡'●)

关于功能需求。

1、可以加入排班制度,不在班次的人不会被发送告警消息。 我们公司是白夜休休的值班制度,可以设置不值班的时间不会被企业微信机器人@,不被发送邮件等。。
2、希望相关的技术文档更多更详细一些。

docker部署,mysql监控,后台会报查询mysql出错。

从后台执行日志看,应该是执行查询时没有传递mysql的密码引起的。
我反复确认过多次,数据源肯定是定义了用户名和密码。我查看data_source表,proterties字段中保存了正确的用户名密码。
并且在新增告警时,页面中的“测试”按钮执行是能正确返回结果的。

"2021-01-30T00:34:39.210+08:00" "WARN" "com.autohome.frostmourne.monitor.service.core.execute.GenerateShortLinkService" "55" "-" "-" "error when generate short link. response: {""returncode"":0,""message"":""ok"",""result"":""""}" "com.autohome.frostmourne.monitor.service.core.execute.GenerateShortLinkService" "generate" "-" "-" "tech" "frostmourne" "frostmourne.monitor" "-" "394" "Thread-264" "-" "172.18.0.4" "-" "-" "-" "-" "-"
"2021-01-30T00:34:47.230+08:00" "ERROR" "com.alibaba.druid.pool.DruidDataSource" "53" "java.sql.SQLException" "Access denied for user 'xxxxxx'@'10.10.5.220' (using password: YES)" "create connection error, url: jdbc:mysql://10.10.5.27:3306/xxxxxxx" "com.alibaba.druid.support.logging.Log4j2Impl" "error" "-" "-" "tech" "frostmourne" "frostmourne.monitor" "-" "226" "Druid-ConnectionPool-Create-1187914410" "-" "172.18.0.4" "-" "-" "-" "-" "java.sql.SQLException: Access denied for user 'xxxxxx'@'10.10.5.220' (using password: YES)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836)
at com.mysql.cj.jdbc.ConnectionImpl.(ConnectionImpl.java:456)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1375)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1431)
at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:1888)

是否可以添加手动确认告警actived

是否可以添加手动确认告警actived, 比如告警连续在发生然后我们可以手动点击这个告警然后进行确认,一段时间内此告警就不会发生了。

连接Microsoft LDAP异常

ldap_enabled=true
spring_ldap_urls=192.168.1.2
spring_ldap_username=tech
spring_ldap_password=abc@123
spring_ldap_base=ou=技术部,dc=sh,dc=energy-blockchain,dc=com
spring_ldap_auth_searchFilter=sAMAccountName={0}

"2020-11-30T10:53:56.281+08:00" "ERROR" "com.autohome.frostmourne.monitor.service.account.impl.LdapAuthService" "38" "org.springframework.ldap.UncategorizedLdapException" "Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: Cannot parse url: 192.168.1.2/ou=æ%C2%8A%C2%80æ%C2%9C¯é%C2%83¨,dc=sh,dc=energy-blockchain,dc=com [Root exception is java.net.MalformedURLException: Invalid URI: 192.168.1.2/ou=æ%C2%8A%C2%80æ%C2%9C¯é%C2%83¨,dc=sh,dc=energy-blockchain,dc=com]" "error when ldap authenticate user: bin.sun" "com.autohome.frostmourne.monitor.service.account.impl.LdapAuthService" "validate" "-" "-" "tech" "frostmourne" "frostmourne.monitor" "-" "25" "http-nio-10054-exec-3" "-" "192.168.1.166" "-" "-" "-" "-" "org.springframework.ldap.UncategorizedLdapException: Uncategorized exception occured during LDAP processing; nested exception is javax.naming.NamingException: Cannot parse url: 192.168.1.2/ou=æ%C2%8A%C2%80æ%C2%9C¯é%C2%83¨,dc=sh,dc=energy-blockchain,dc=com [Root exception is java.net.MalformedURLException: Invalid URI: 192.168.1.2/ou=æ%C2%8A%C2%80æ%C2%9C¯é%C2%83¨,dc=sh,dc=energy-blockchain,dc=com]

不清LDAP这块的配置该如何配置的,报了一个如图的错误,用的是微软的AD Server,配置如图,Urls和base这两块配置找了下没有可供参考的。

监控编辑保存的问题

提交保存是失败,报如下异常

feign.FeignException: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (BufferedReader); line: 1, column: 2] reading POST http://192.168.1.109:8089/xxl-job-admin/jobinfo/add
at feign.FeignException.errorReading(FeignException.java:120) ~[feign-core-10.5.1.jar:?]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:157) ~[feign-core-10.5.1.jar:?]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:80) ~[feign-core-10.5.1.jar:?]
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-10.5.1.jar:?]
at com.sun.proxy.$Proxy95.addJob(Unknown Source) ~[?:?]
at com.autohome.frostmourne.monitor.service.admin.impl.ScheduleService.addJob(ScheduleService.java:33) ~[classes/:?]
at com.autohome.frostmourne.monitor.service.admin.impl.AlarmAdminService.saveJobSchedule(AlarmAdminService.java:406) ~[classes/:?]
at com.autohome.frostmourne.monitor.service.admin.impl.AlarmAdminService.save(AlarmAdminService.java:267) ~[classes/:?]
at com.autohome.frostmourne.monitor.service.admin.impl.AlarmAdminService.atomicSave(AlarmAdminService.java:110) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at com.sun.proxy.$Proxy97.atomicSave(Unknown Source) ~[?:?]
at com.autohome.frostmourne.monitor.controller.AdminController.save(AdminController.java:29) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_91]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_91]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_91]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_91]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:526) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [?:1.8.0_91]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [?:1.8.0_91]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]
at java.lang.Thread.run(Thread.java:745) [?:1.8.0_91]
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (JSON String, Number, Array, Object or token 'null', 'true' or 'false')
at [Source: (BufferedReader); line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1840) ~[jackson-core-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:712) ~[jackson-core-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:637) ~[jackson-core-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser._handleOddValue(ReaderBasedJsonParser.java:1917) ~[jackson-core-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:773) ~[jackson-core-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:4340) ~[jackson-databind-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4189) ~[jackson-databind-2.10.1.jar:2.10.1]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3234) ~[jackson-databind-2.10.1.jar:2.10.1]
at feign.jackson.JacksonDecoder.decode(JacksonDecoder.java:61) ~[feign-jackson-10.4.0.jar:?]
at feign.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:178) ~[feign-core-10.5.1.jar:?]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:142) ~[feign-core-10.5.1.jar:?]
... 65 more

聚合类型为count时可以按字段吗

各位大佬好,目前的平台在聚合类型为count时可以按字段统计吗,如下:
nginx的5xx按域名字段来统计数量并告警,比如单个域名5xx达到10次就告警
目前的count是不区分域名,统计的都是所有值

报警发送添加对用户组的支持并且可以自动发现供选取

[简述你的问题]
希望能通过所属团队查看监控列表,报警发送支持用户组的形式。
对已存在的用户组,在报警发送界面可以支持自动发现供选取。

使用版本
[请提供你使用的frostmourne版本]
0.1-RELEASE

具体表现[截图可能会更好些,最好能截全]
GroupA 对应 UserA,UserB,UserC
通过选择GroupA即可发送至UserA,UserB,UserC

其他
用户组中的用户可能属于不同部门,需要灵活调整。

[注:] 完成后请关闭 issue

使用ldap登录,返回用户不存在

非常感谢此项目,目前在使用的时候,遇到一些问题,希望能白忙之中帮忙解答一下。
谢谢。

情况

开启了 ldap 认证之后,登录提示用户不存在(ldap中是存在登录的用户的,并且在 Jenkins 中配置 ldap 登录,同一用户也能登录 Jenkins)。

monitor 版本

部署使用的是 docker-compose ,镜像:

registry.cn-hangzhou.aliyuncs.com/kechangqing/frostmourne:0.4

ldap 配置

ldap_enabled: 'true'
spring_ldap_urls: ldap://example.com:10389
spring_ldap_username: cn=admin,dc=example,dc=com
spring_ldap_password: xxxxxx
spring_ldap_base: dc=example,dc=com
spring_ldap_auth_searchFilter: uid={0}

同样尝试了 spring_ldap_base 中指定 ou,也是提示用户不存在。

monitor 报错日志

"2021-02-23T11:06:48.684+08:00" "ERROR" "com.autohome.frostmourne.monitor.config.GlobalControllerAdvice"        "24"    "com.autohome.frostmourne.core.contract.ProtocolException"      "用户不存在"    "global catch exception"     "com.autohome.frostmourne.monitor.config.GlobalControllerAdvice"        "handleProtocolException"       "-"     "-"     "tech"  "frostmourne"   "frostmourne.monitor"   "-"     "217"   "http-nio-10054-exec-10"     "-"     "172.20.0.4"    "-"     "-"     "-"     "-"     "com.autohome.frostmourne.core.contract.ProtocolException: 用户不存在
        at com.autohome.frostmourne.monitor.controller.UserController.login(UserController.java:52)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
        at java.lang.reflect.Method.invoke(Method.java:508)
        at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:822)

ldap 日志

发现 ldap 中收到了 2 次请求

60347148 conn=1473 fd=28 ACCEPT from IP=172.18.0.1:53676 (IP=0.0.0.0:389)
60347148 conn=1473 op=0 BIND dn="cn=admin,dc=example,dc=com" method=128
60347148 conn=1473 op=0 BIND dn="cn=admin,dc=example,dc=com" mech=SIMPLE ssf=0
60347148 conn=1473 op=0 RESULT tag=97 err=0 text=
60347148 conn=1473 op=1 SRCH base="dc=example,dc=com" scope=2 deref=3 filter="(uid=testuser)"
60347148 conn=1473 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
60347148 conn=1473 op=2 UNBIND
60347148 conn=1473 fd=28 closed
60347148 conn=1474 fd=28 ACCEPT from IP=172.18.0.1:53680 (IP=0.0.0.0:389)
60347148 conn=1474 op=0 BIND dn="uid=testuser,ou=People,dc=example,dc=com" method=128
60347148 conn=1474 op=0 BIND dn="uid=testuser,ou=People,dc=example,dc=com" mech=SIMPLE ssf=0
60347148 conn=1474 op=0 RESULT tag=97 err=0 text=
60347148 conn=1474 op=1 UNBIND
60347148 conn=1474 fd=28 closed

建议调度配置后可以显示预期执行时间

[简述你的问题]
调度配置完成后,希望能提供一个按钮,查看接下来几次的执行时间。

使用版本

[请提供你使用的frostmourne版本]
0.1-RELEASE

具体表现[截图可能会更好些,最好能截全]

类似 Cron 为 0 0/40 * * * ? ,点击按钮显示如下:
2020-06-16 11:40:00
2020-06-16 12:00:00
2020-06-16 12:40:00
2020-06-16 13:00:00
2020-06-16 13:40:00

[注:] 完成后请关闭 issue

LDAP账号同步问题

这个只做了密码认证功能,每次来新人的时候需要手动创建用户信息,比较麻烦

通过HTTP监控告警出现unknown exception

我想通过监控prometheus http api 来触发告警, 在后台配置好监控地址后, 浏览数据正常.
{
"data": {
"resultType": "vector",
"result": [
{
"metric": {
"name": "kafka_cluster_partition_atminisr",
"instance": "localhost:9991",
"job": "ad-kafka",
"partition": "0",
"topic": "ad_station"
},
"value": [
1648002724.339,
"0"
]
}
]
},
"HTTP_STATUS": 200,
"EXPRESSION": "data.result[0].value[0] > 10",
"HTTP_COST": 2,
"status": "success"
}

然后在告警规则中判断表达式: data.result[0].value[0] > 10
最后保存的时候提示: unknown exception

请问我有哪里写的有问题吗?

当 [数据名] 未填写 [说明] 时,监控编辑中数据源选择显示为空白(可选取)

[简述你的问题]

当 [数据名] 未填写 [说明] 时,监控编辑中数据源选择显示为空白(可选取)

使用版本

[请提供你使用的frostmourne版本]
master:6452c52

具体表现[截图可能会更好些,最好能截全]

数据名

ID 名称 说明
1 dev dev_env
2 ops
3 prod

监控编辑——>数据配置——>数据,下拉框显示为

  • dev_env
  • 空白
  • 空白

其他

可以考虑下拉框显示 [数据名] 中的 [名称],鼠标悬停显示 [说明]

[注:] 完成后请关闭 issue

es数据分桶统计后如何按BUCKETS来告警

大佬好,又来提问了,es数据分桶统计后如何按BUCKETS来告警,返回的json串中有BUCKETS字段,可以循环输出在一个告警项中,或者按每个BUCKETS中的值分开告警吗?

数据查询页面不支持ES8

org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [type=x_content_parse_exception, reason=[1:792] [date_histogram] unknown field [interval] did you mean [fixed_interval]?]

连接https的Elasticsearch失败

"2021-03-22T17:33:52.008+08:00" "ERROR" "com.autohome.frostmourne.monitor.dao.elasticsearch.EsRestClientContainer" "102" "javax.net.ssl.SSLHandshakeException" "PKIX path building failed: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target" "error when check cluster health" "com.autohome.frostmourne.monitor.dao.elasticsearch.EsRestClientContainer" "health" "-" "-" "tech" "frostmourne" "frostmourne.monitor" "-" "222" "http-nio-10054-exec-1" "-" "10.101.1.211" "-" "-" "-" "-" "javax.net.ssl.SSLHandshakeException: PKIX path building failed: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target
at org.elasticsearch.client.RestClient$SyncResponseListener.get(RestClient.java:947)
at org.elasticsearch.client.RestClient.performRequest(RestClient.java:229)
at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1762)
at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1732)
at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1694)
at org.elasticsearch.client.ClusterClient.health(ClusterClient.java:146)
at com.autohome.frostmourne.monitor.dao.elasticsearch.EsRestClientContainer.health(EsRestClientContainer.java:100)
at com.autohome.frostmourne.monitor.dao.elasticsearch.ElasticsearchSourceManager.reloadEsRestClientContainer(ElasticsearchSourceManager.java:47)
at com.autohome.frostmourne.monitor.service.admin.impl.DataAdminService.saveDataSource(DataAdminService.java:74)
at com.autohome.frostmourne.monitor.controller.DataNameController.saveDataSource(DataNameController.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
at java.lang.reflect.Method.invoke(Method.java:508)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:747)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1160)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:822)
Caused by: javax.net.ssl.SSLHandshakeException: PKIX path building failed: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target
at com.ibm.jsse2.g.a(g.java:58)
at com.ibm.jsse2.ba.a(ba.java:38)
at com.ibm.jsse2.ba.a(ba.java:101)
at com.ibm.jsse2.ba.a(ba.java:62)
at com.ibm.jsse2.y$c.a(y$c.java:166)
at com.ibm.jsse2.y$c.a(y$c.java:10)
at com.ibm.jsse2.y$c.consume(y$c.java:6)
at com.ibm.jsse2.p.consume(p.java:43)
at com.ibm.jsse2.Z.a(Z.java:73)
at com.ibm.jsse2.bf$a$b.a(bf$a$b.java:2)
at com.ibm.jsse2.bf$a$b.run(bf$a$b.java:3)
at java.security.AccessController.doPrivileged(AccessController.java:774)
at com.ibm.jsse2.bf$a.run(bf$a.java:26)
at org.apache.http.nio.reactor.ssl.SSLIOSession.doRunTask(SSLIOSession.java:288)
at org.apache.http.nio.reactor.ssl.SSLIOSession.doHandshake(SSLIOSession.java:356)
at org.apache.http.nio.reactor.ssl.SSLIOSession.isAppInputReady(SSLIOSession.java:537)
at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:120)
at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:591)
... 1 more
Caused by: com.ibm.jsse2.util.j: PKIX path building failed: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target
at com.ibm.jsse2.util.h.a(h.java:120)
at com.ibm.jsse2.util.h.b(h.java:5)
at com.ibm.jsse2.util.g.a(g.java:10)
at com.ibm.jsse2.bq.a(bq.java:32)
at com.ibm.jsse2.bq.a(bq.java:70)
at com.ibm.jsse2.bq.checkServerTrusted(bq.java:10)
at com.ibm.jsse2.y$c.a(y$c.java:99)
... 19 more
Caused by: com.ibm.security.cert.IBMCertPathBuilderException: unable to find valid certification path to requested target
at com.ibm.security.cert.SunCertPathBuilder.build(SunCertPathBuilder.java:139)
at com.ibm.security.cert.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:124)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:292)
at com.ibm.jsse2.util.h.a(h.java:124)
... 25 more

用户问题

每次新增用户的时候需要重启spi服务,没法自助处理。

建议前期先增加用户管理功能方便用户自助维护,后期根据功能需要再对接第三方用户系统,比如sso,ldap之类的。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.