Skywalking改成适配阿里云等带Http Basic的Elasticsearch服务

目录
  • 前言
  • skywalking项目结构
  • 定位代码改动
  • 注意事项
  • 结语

前言

最近公司skywalking服务经常出现大盘空白的情况,经查明,是由于ES的写入瓶颈造成线程阻塞,数据没有落地到ES造成。后综合运维成本等方面考虑,准备使用阿里云提供的Elasticsearch服务,阿里云的ES无论内外网都加上了Http Basic认证,但是skywalking6.x提供的RestHighLevelClient客户端并没有适配带Http Basic基础认证的ES服务,所以需要稍加改动下skywalking源码。

skywalking项目结构

项目从github拉下来后,先了解下项目结构。在skywalking2.x的版本时,我曾研究过skywalking的插件机制,到现在的6.x版本,在项目结构和设计上都有了很大的变化。6.x的项目结构如下,我们主要关注箭头所指的模块,es存储插件的实现

定位代码改动

1.定位StorageModuleElasticsearchConfig.java,新增Http Basicr认证所需的用户和密码

@Setter @Getter private String nameSpace;
    @Setter @Getter private String clusterNodes;
    private int indexShardsNumber;
    private int indexReplicasNumber;
    private boolean highPerformanceMode;
    private int traceDataTTL = 90;
    private int minuteMetricDataTTL = 90;
    private int hourMetricDataTTL = 36;
    private int dayMetricDataTTL = 45;
    private int monthMetricDataTTL = 18;
    private int bulkActions = 2000;
    private int bulkSize = 20;
    private int flushInterval = 10;
    private int concurrentRequests = 2;
    private String user;
    private String password;

2.定位ElasticSearchClient.java,新增用户和密码属性,改动构造方法,将用户和密码传入进来,在创建connect时判断用户是否配置了认证信息,如果配置就走带认证的连接,如果没有,就走默认的不带认证连接,具体改动如下:

private static final String TYPE = "type";
    private final String clusterNodes;
    private final String namespace;
    private final String user;
    private final String password;
    private RestHighLevelClient client;
    public ElasticSearchClient(String clusterNodes, String namespace, String user, String password) {
        this.clusterNodes = clusterNodes;
        this.namespace = namespace;
        this.user = user;
        this.password = password;
    }
    @Override
    public void connect() {
        ListpairsList = parseClusterNodes(clusterNodes);
        RestClientBuilder builder;
        if (StringUtils.isNotBlank(user) && StringUtils.isNotBlank(password)) {
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(user, password));
            builder = RestClient.builder(pairsList.toArray(new HttpHost[0]))
                    .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                        @Override
                        public HttpAsyncClientBuilder customizeHttpClient(
                                HttpAsyncClientBuilder httpClientBuilder) {
                            return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                        }
                    });
        } else {
            builder = RestClient.builder(pairsList.toArray(new HttpHost[0]));
        }
        client = new RestHighLevelClient(builder);
    }

Elasticsearch的basic_authentication连接官方文档说明:https://www.elastic.co/guide/en/elasticsearch/client/doc

3.定位StorageModuleElasticsearchProvider.java和ElasticSearchClientTestCase.java 修改构造方法入参。基本上就是如上的改动,就可以让skywalking支持带basic_authentication认证的Elasticsearch服务了。在配置时添加user和password,如:

storage:
  elasticsearch:
    nameSpace: ${SW_NAMESPACE:""}
    clusterNodes: ${SW_STORAGE_ES_CLUSTER_NODES:localhost:9200}
    user: ${SW_ES_USER:""}
    password: ${SW_ES_PASSWORD:""}
    indexShardsNumber: ${SW_STORAGE_ES_INDEX_SHARDS_NUMBER:2}
    indexReplicasNumber: ${SW_STORAGE_ES_INDEX_REPLICAS_NUMBER:0}
    # Batch process setting, refer to https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.5/java-docs-bulk-processor.html
    bulkActions: ${SW_STORAGE_ES_BULK_ACTIONS:2000} # Execute the bulk every 2000 requests
    bulkSize: ${SW_STORAGE_ES_BULK_SIZE:20} # flush the bulk every 20mb
    flushInterval: ${SW_STORAGE_ES_FLUSH_INTERVAL:10} # flush the bulk every 10 seconds whatever the number of requests
    concurrentRequests: ${SW_STORAGE_ES_CONCURRENT_REQUESTS:2} # the number of concurrent requests

注意事项

  • skywalking项目从个人开源走到国际化开源项目,和其代码质量和项目管理密不可分。skywalking项目里有严格的代码编译检查,比如逗号前面不能有空格,逗号后面一定要有空格等。
  • 还有别忘记修改assembly\application.yml文件,添加上user和password,不然打出来的包默认不带这两个配置属性
  • 编译的话,因为涉及到GPRC部分的依赖,和前端子项目的结构,需要做些处理。
  • 因为系统字符集的问题,Windows系统下打出来的包,bin目录下的shell脚步可能运行不了,这个是因为Windows字符集的问题导致的,不过没关系,可以拷贝官方包中的脚步替换

改完编译成功后,会在项目的根目录下生产一个dist目录,目录下包含两个压缩包,分别对应linux系统tar,和Windows下的zip包。

结语

其实解决这个问题的方式除了改造skywalking外,还可以通过Nginx做一下转发,Http Basic认证的动作在Nginx侧给做了。之所以想到改动skywalking,是因为Elasticsearch的RestHighLevelClient 官方文档有这种Http Basic认证支持说明。所以觉得是一个比较常规的操作,而不是多依赖一个外部组件来解决。

目前关于改动Elasticsearch Client支持Http Basic的代码已给官方提交pr,在是否需要合并此pr,和skywalking作者们沟通交流很多个来回。截止发文这个pr还没正式合并到官方仓库。如果你看到这了,希望能发表下你对这个pr合并的意见和看法。不过,最后还是希望这个pr能够合并进去,能用官方发布的版本解决Http Basic认证的问题最好了。

以上就是Skywalking改成适配阿里云等带Http Basic的Elasticsearch服务的详细内容,更多关于Skywalking改造成支持阿里云等带服务的资料请关注我们其它相关文章!

(0)

相关推荐

  • net core下链路追踪skywalking安装和简单使用教程

    当我们用很多服务时,各个服务间的调用关系是怎么样的?各个服务单调用的顺序\时间性能怎么样?服务出错了,到底是哪个服务引起的?这些问题我们用什么方案解决呢,以前的方式是各个系统自己单独做日志,出了问题从暴出问题的服务开始一个一个服务的排查,耗时耗力,有些日志不全的,还不一定查得出来.好在现在有Skywalking链路追踪系统,可以不用写任何代码,就追踪到各个服务间的调用关系和性能状态等. 本文将从0开始搭建两个webapi项目,使用Skywalking来追踪他们之间的调用关系及响应时间.开发环境为

  • 解析Arthas协助排查线上skywalking不可用问题

    目录 前言 使用到的工具arthas 先定位问题一 问题一: 问题解决: 功能说明 参数说明 定位问题二 问题二: 问题解决: 结语 前言 首先描述下问题的背景,博主有个习惯,每天上下班的时候看下skywalking的trace页面的error情况.但是某天突然发现生产环境skywalking页面没有任何数据了,页面也没有显示任何的异常,有点慌,我们线上虽然没有全面铺开对接skywalking,但是也有十多个应用.看了应用agent端日志后,其实也不用太担心,对应用毫无影响.大概情况就是这样,但

  • python实现skywalking的trace模块过滤和报警(实例代码)

      skywalking本身的报警功能,用起来视乎不是特别好用,目前想实现对skywalking的trace中的错误接口进行过滤并报警通知管理员和开发.所以自己就用python对skywalking做了二次数据清洗实现.项目方在了自己了github(https://github.com/shygit-dev/skywalking-cli-python)上了,有兴趣的同学可以做二次改造,共同学习.下面简单列出了代码内容: sw-trace.py #!/usr/bin/env python # _*

  • Elasticsearch写入瓶颈导致skywalking大盘空白

    目录 前言 问题定位 THREAD-B,找出当前阻塞其他线程的线程 解决方案 临时方案,SKYWALKING参数调优 最终方案-优化ES的写入性能 结语 前言 继上次skywalking出故障<解析Arthas协助排查线上skywalking不可用问题>不到一个月,线上skywalking又出毛病了.又是大盘空白,trace列表最近的数据都查询不出来,但是时间稍久的数据就能查询出来,如一天前的数据有,一个小时前的数据就没有,这个只是表象,最终查明症结是ES的服务写入瓶颈,导致写入写入数据的线程

  • Skywalking改成适配阿里云等带Http Basic的Elasticsearch服务

    目录 前言 skywalking项目结构 定位代码改动 注意事项 结语 前言 最近公司skywalking服务经常出现大盘空白的情况,经查明,是由于ES的写入瓶颈造成线程阻塞,数据没有落地到ES造成.后综合运维成本等方面考虑,准备使用阿里云提供的Elasticsearch服务,阿里云的ES无论内外网都加上了Http Basic认证,但是skywalking6.x提供的RestHighLevelClient客户端并没有适配带Http Basic基础认证的ES服务,所以需要稍加改动下skywalki

  • 详解docker使用阿里云Docker镜像库加速(修订版)

    官方镜像下载实在是慢,于是开通了阿里云开发者帐号, 阿里的文档是错误的, 复制代码 代码如下: sudo sed -i "s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=https://pee6w651.mirror.aliyuncs.com|g" /etc/systemd/system/docker.service 这一句改为 复制代码 代码如下: sudo s

  • 在阿里云函数计算上部署.NET Core 3.1的方法

    使用阿里云ECS或者其他常见的VPS服务部署应用的时候,需要手动配置环境,并且监测ECS的行为,做补丁之类的,搞得有点复杂.好在很多云厂商(阿里云.Azure等)提供了Serverless服务,借助于Serverless,开发人员可以更加专注于代码的开发,减少运维的成本. Azure的部署直接集成在了VS中,非常方便,本文主要介绍一下使用ASP.NET CORE 3.1部署在阿里云Serverless(函数计算)的内容. 准备 阿里云的函数计算提供了很多运行库,对.NET的支持现在到ASP.NE

  • 阿里云ECS服务器入门使用流程(新手必看教程)

    一.阿里云根据个人需要选合适的云服务器,选好cpu.内存.带宽,地域,这四个是主要的.其他可以默认选择. 二.登陆控制台 输入账号密码,进去看到服务界面,新手可能不容易看懂.点击左侧菜单,点击云服务器,显示界面如图: 点击实例,在左上角选择区域(一定要选对地域才能看到服务器),这时看到服务器信息了,如图: 大家不要看这里这么多信息,对我们有用的其实只有几个而已,别的都不用看. 更多参阅云服务器配置帮助文档. 三.连接主机 1.通过控制台连接 阿里云服务器要用到两个密码,一个是远程登录密码,一个是

  • 阿里云主机不能用IP访问网站的解决方法(配置安全组规则搞定)

    刚买了一台阿里云主机,迫不待及的试试速度,怎知网站访问不了,用IP或绑定域名都无法访问,后来提交工单才知道,需要配置安全组规则才行.针对同样像我一样的新手,本文就介绍一下如何在开通阿里云主机后配置安全组规则,让网站能够外网访问. 1.打开安全组管理界面 安全组管理界面的位置在,菜单->网络与安全->安全组,在这里可以创建安全组实例(如果还没创建实例的话),或者配置安全组规则(如果购买主机时已经创建实例). 安全组管理(点击图片放大) 点击"配置规则",如果还没有创建实例的话

  • SpringBoot整合阿里云视频点播的过程详解

    目录 1.准备工作 2.服务端SDK的使用 2.1 导入依赖 2.2 初始化类 2.3 创建读取公共常量的工具类 2.4 获取视频播放地址 2.5 获取视频播放凭证 2.6 上传视频到阿里云视频点播服务 3.springboot项目中实践 3.1 上传视频到阿里云 3.2 根据视频id删除视频 1.准备工作 首先需要在阿里云开通视频点播服务: 1.首先,进入到阿里云视频点播平台,点击开通服务,选择按使用流量计费即可 2.开通之后点击进入管理控制台即可 视频点播有什么用? 视频点播(ApsaraV

  • django 将自带的数据库sqlite3改成mysql实例

    在settings.py中将默认内容覆盖成 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'wechat', 'USER':'root', 'PASSWORD':'123456', 'HOST':'127.0.0.1', 'PORT':'3306', } } 然后 msql -u root -p 输入密码 create database wechat default charset=utf8; 补

  • 阿里云ECS服务器部署django的方法

    参考 服务器安装的是Centos 系统. uwsgi是使用pip安装的. nginx是使用yum install nginx安装. python 2.7, mysql 5.5使用 yum安装. 它们之间的逻辑关系如下: the web client <-> the web server <-> the socket <-> uwsgi <-> Django uswgi负责从Django拿内容,通过socket传给 web server如nginx, 最后显示

  • 部署Django到阿里云服务器教程示例

    基于Ubuntu16.04 + Python3 + nginx + mysql + Django 接下来先安装这些必要的环境,这些操作都是在你已经购买了阿里云服务器.并且在本地你已经搭建好了Django博客.现在我们所做的就是把本地的环境在阿里云的服务器上重新搭一遍. 这里先简单的说一下阿里云服务器,我自己买的是云服务器ESC,需要配置一下安全组规则,就是端口,按下图配置即可,最重要的是22和88端口. 然后就是我们的服务器在实例里,我的是Ubuntu16.04,要部署到阿里云上点击远程连接,第

  • SpringBoot项目部署到阿里云服务器的实现步骤

    目录 一.申请阿里云服务器 二.Xshell 的安装使用 三.云服务器上jdk的安装 四.linux云服务器安装mysql 五.部署SpringBoot项目 SpringBoot项目部署到阿里云linux服务器全流程 文章里所有需要的软件.jdk.mysql.xshell等下载地址: Xshell 5 下载地址:https://www.jb51.net/softs/56322.html jdk下载地址:https://www.jb51.net/softs/698365.html tomcat下载

随机推荐