文档章节

new relic agent for elasticsearch

Faye_Cai
 Faye_Cai
发布于 2016/06/15 15:50
字数 507
阅读 7
收藏 0

流程:

MainProcess MainThread newrelic_plugin_agent.agent                   process                   L155   : Stats processed in 10.15 seconds, next wake in 49 seconds
MainProcess MainThread newrelic_plugin_agent.agent                   start_plugin_polling      L292   : Enabling plugin: elasticsearch
MainProcess MainThread newrelic_plugin_agent.agent                   start_plugin_polling      L296   : passed in plugin name: elasticsearch
MainProcess MainThread newrelic_plugin_agent.agent                   start_plugin_polling      L298   : Plugin is available
MainProcess MainThread newrelic_plugin_agent.plugins.base            finish                    L158   : ElasticSearch poll successful, completed in 0.12 seconds
MainProcess     MainThread newrelic_plugin_agent.agent                   send_components           L250   : Sending 94 metrics to NewRelic

几个关键py 及调用流程:

1. newrelic_plugin_agent/plugin/__init__.py

'elasticsearch':'newrelic_plugin_agent.plugins.elasticsearch.ElasticSearch',

2. newrelic_plugin_agent/agent.py

====  

def process(self):
        """This method is called after every sleep interval. If the intention
        is to use an IOLoop instead of sleep interval based daemon, override
        the run method.

        """
        start_time = time.time()
        self.start_plugin_polling()

        # Sleep for a second while threads are running
        while self.threads_running:
            time.sleep(1)

        self.threads = list()
        self.send_data_to_newrelic()
        duration = time.time() - start_time
        self.next_wake_interval = self._wake_interval - duration
        if self.next_wake_interval < 1:
            LOGGER.warning('Poll interval took greater than %i seconds',
                           duration)
            self.next_wake_interval = int(self._wake_interval)
        LOGGER.info('Stats processed in %.2f seconds, next wake in %i seconds',
                    duration, self.next_wake_interval)

====  

def start_plugin_polling(self):
        """Iterate through each plugin and start the polling process."""
        for plugin in [key for key in self.config.application.keys()
                       if key not in self.IGNORE_KEYS]:
            LOGGER.info('Enabling plugin: %s', plugin)
            plugin_class = None

            # If plugin is part of the core agent plugin list
        LOGGER.info('passed in plugin name: %s',plugin)
            if plugin in plugins.available:
        LOGGER.info("Plugin is available")
                plugin_class = self._get_plugin(plugins.available[plugin])

            # If plugin is in config and a qualified class name
            elif '.' in plugin:
                plugin_class = self._get_plugin(plugin)

            # If plugin class could not be imported
            if not plugin_class:
                LOGGER.error('Enabled plugin %s not available', plugin)
                continue
        try:
                self.poll_plugin(plugin, plugin_class,
                             self.config.application.get(plugin))

===

    def poll_plugin(self, plugin_name, plugin, config):
        """Kick off a background thread to run the processing task.

        :param newrelic_plugin_agent.plugins.base.Plugin plugin: The plugin
        :param dict config: The config for the plugin

        """

        if not isinstance(config, (list, tuple)):
            config = [config]

        for instance in config:
            thread = threading.Thread(target=self.thread_process,
                                      kwargs={'config': instance,
                                              'name': plugin_name,
                                              'plugin': plugin,
                                              'poll_interval':
                                                  int(self._wake_interval)})
            thread.run()
            self.threads.append(thread)

====

def thread_process(self, name, plugin, config, poll_interval):
        """Created a thread process for the given name, plugin class,
        config and poll interval. Process is added to a Queue object which
        used to maintain the stack of running plugins.

        :param str name: The name of the plugin
        :param newrelic_plugin_agent.plugin.Plugin plugin: The plugin class
        :param dictlconfig: The plugin configuration
        :param int poll_interval: How often the plugin is invoked

        """
        instance_name = "%s:%s" % (name, config.get('name', 'unnamed'))
        obj = plugin(config, poll_interval,
                     self.derive_last_interval.get(instance_name))
        obj.poll()
      # 调用elasticsearch.py 中从父类base.py继承来的poll()

3. newrelic_plugin_agent/plugin/base.py

    def poll(self):
        """Poll HTTP JSON endpoint for stats data"""
        self.initialize()
        data = self.fetch_data()
        if data:
            self.add_datapoints(data)
        self.finish()

 

4. newrelic_plugin_agent/plugin/elasticsearch.py

    def add_datapoints(self, stats):
        """Add all of the datapoints for the Elasticsearch poll

        :param dict stats: The stats to process for the values

        """
        totals = dict()
        for node in stats.get('nodes'):
            if stats['nodes'][node]['host']==socket.gethostname():
                totals=stats['nodes'][node]
                        break
        self.add_index_datapoints(totals)
        self.add_network_datapoints(totals)
        self.add_jvm_datapoints(totals)
        self.add_threadpool_datapoints(totals)
        self.add_transport_datapoints(totals)
        self.add_circuitbreaker_datapoints(totals)
        self.add_cluster_stats()

 

 

© 著作权归作者所有

下一篇: new relic issue
Faye_Cai
粉丝 0
博文 28
码字总数 5590
作品 0
海淀
高级程序员
私信 提问
Uber jaeger--一个基于Go的分布式追踪系统

Jaeger-Uber开源的一个基于Go的分布式追踪系统 最近因工作需要在研究traing系统,最后选了jaeger,下面是一些总结,同时摘抄了网上的一些资料,并结合自己实践过程中遇到的一些什么问题,欢迎...

北极之北
2018/05/30
3.9K
3
安装Elasticsearch-Apm

概述 Elastic APM是一个基于Elastic Stack构建的应用程序性能监控系统。它允许您实时监控软件服务和应用程序,收集有关传入请求的响应时间,数据库查询,高速缓存调用,外部HTTP请求等的详细...

Linux_Anna
02/25
314
0
logstash_forward+flume+elasticsearch+kibana日志收集框架

最开始架构定的是采用elk来做日志的收集,但是测试一段时间后,由于logstash的性能很差,对cpu和内存消耗很大,放弃了logstash。为什么没有直接使用flume的agent来收集日志,这主要是根据实际...

super_yu
2015/10/28
3K
1
使用elasticsearch作为存储引擎部署jaeger

使用elasticsearch作为存储引擎部署jaeger 由于网上大部分文章部署jaeger都是使用Cassandra,使用elasticsearch较少,而我主要是使用elasticsearch来部署的,下面是我的一些使用总结,欢迎指针...

北极之北
2018/05/30
2.9K
1
小白都会超详细--ELK日志管理平台搭建教程

目录 一、介绍 二、安装JDK 三、安装Elasticsearch 四、安装Logstash 五、安装Kibana 六、Kibana简单使用 系统环境:CentOS Linux release 7.4.1708 (Core) 当前问题状况 开发人员不能登录线...

渣渣辉
2018/07/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
44分钟前
3
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
45分钟前
5
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
53分钟前
5
1
正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置

正则表达式如何匹配一个单词存在一次或零次并且不占捕获组位置 今天要用正则表达式实现匹配一个词出现一次或者不出现的情况,但是又不仅仅是这么简单的需求。先详细说下我这种情况吧,也许有...

Airship
59分钟前
6
0
第八讲:asp.net C# web 读取文件

本讲主要讲解如何在asp.net页面上传文件。 首先,前台页面: 其次,后台页面: 结果: 1、前台效果: 2、后台结果:

刘日辉
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部