python - 使用 Plotly Dash for Python 进行 JBeans (JMX) 监控

标签 python jmx plotly-dash jconsole

我正在尝试使用 dash 来实时监控 JBeans 属性。使用 dcc.Interval 时,程序会在第一次 POST/_dash-update-component 尝试后自动关闭。

  • Python 3.6
  • 达世币1.0.2

我连接到 Jconsole。引用 Jbean 属性并提取值是可行的。当我第一次启动破折号应用程序时它甚至可以工作,但是当触发间隔时破折号程序关闭。

  • JBean 已测试 - 工作正常
  • 经过测试的 Dash 代码 - 它可以很好地提取 n_intervals

步骤:

  1. JMX 功能模块
import jpype as jpype
from jpype import java
from jpype import javax
import sys, os
import pandas as pd
import datetime

#JMX CONNECTION FUNCTION:

def jmx_connect(HOST, USER, PORT, PASS):
    URL = 'service:jmx:rmi:///jndi/rmi://'+HOST+':'+PORT+'/jmxrmi'
    jpype.startJVM(jpype.get_default_jvm_path())
    jhash = java.util.HashMap()
    jarray=jpype.JArray(java.lang.String)([USER,PASS])
    jhash.put(javax.management.remote.JMXConnector.CREDENTIALS, jarray);
    jmxurl = javax.management.remote.JMXServiceURL(URL)
    jmxsoc = javax.management.remote.JMXConnectorFactory.connect(jmxurl,jhash)
    connection = jmxsoc.getMBeanServerConnection();
    return connection

#Enter login details HERE:
HOST = 
USER = 
PORT = 
PASS = 

#initializing connection with my login details
connection = jmx_connect(HOST, USER, PORT, PASS)


#Thread Count function to extract number of active threads:
#THREAD COUNT
def jmx_ThreadCount():
    object="java.lang:type=Threading"
    attribute= "ThreadCount"
    attr = connection.getAttribute(javax.management.ObjectName(object),attribute)
    return attr
  • 仪表板模块
  • from TEST_jvmRun import *  #this is import of my JVM functions
    import dash
    import dash_core_components as dcc
    import dash_html_components as html
    from dash.dependencies import Input, Output
    import plotly.graph_objs as go
    
    app = dash.Dash()
    
    app.layout = html.Div([
        html.H1(id='live-update-text'),
        dcc.Interval(id='interval-component', interval=10000, n_intervals=0)
    ])
    
    @app.callback(Output('live-update-text', 'children'),
                  [Input('interval-component', 'n_intervals')])
    def update_current_delay(n): 
        #return f"counter: {n}"
        return f"WORKING, trial: {n}  ; {jmx_ThreadCount()}" 
    
    if __name__ == '__main__':
        app.run_server()
    

    a) 实际结果

    ---命令行输出:

    C:\Users\m011472\Documents\Python Scripts\Web>cd "c:\Users\m011472\Documents\Python Scripts\Web" && cmd /C "set "PYTHONIOENCODING=UTF-8" && set "PYTHONUNBUFFERED=1" && C:\Python36\python.exe C:\Users\m011472\.vscode\extensions\ms-python.python-2018.4.0\pythonFiles\PythonTools\visualstudio_py_launcher.py "c:\Users\m011472\Documents\Python Scripts\Web" 53564 34806ad9-833a-4524-8cd6-18ca4aa74f14 RedirectOutput,RedirectOutput "c:\Users\m011472\Documents\Python Scripts\Web\TEST_dashboard.py" "
     * Serving Flask app "TEST_dashboard" (lazy loading) * Environment: production   WARNING: Do not use the development server in a production environment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on http://127.0.0.1:8050/ (Press CTRL+C to quit)
    127.0.0.1 - - [28/Mar/2019 14:57:02] "GET / HTTP/1.1" 200 -
    127.0.0.1 - - [28/Mar/2019 14:57:03] "GET /_dash-layout HTTP/1.1" 200 -
    127.0.0.1 - - [28/Mar/2019 14:57:03] "GET /_dash-dependencies HTTP/1.1" 200 -
    127.0.0.1 - - [28/Mar/2019 14:57:03] "POST /_dash-update-component HTTP/1.1" 200 -
    
    C:\Users\m011472\Documents\Python Scripts\Web>
    

    --- 仪表板输出:

    正在工作,试用:0;第418章

    b) 预期结果

    ---命令行输出:

    程序应该每 10 秒执行一次 POST 并且永不结束

    --- 仪表板输出:

    数字应每 10 秒更新一次

    正在工作,试用:0; XXX(任意数字) 工作,试用:1; XXY 工作,试用:2; XXZ

    最佳答案

    如果有人感兴趣 - 我找到了部分解决方案。 dcc.Interval 引起的问题,因为它在每个时间间隔创建新线程,并且 JMX 调用需要将 JVM 实例附加到当前线程。

    1. 添加了 jpype.attachThreadToJVM()
    def jmx_ThreadCount():
        print("State=", jpype.isThreadAttachedToJVM())
        if not jpype.isThreadAttachedToJVM():
            print ("Needs to attach...")
            jpype.attachThreadToJVM()
            print ("Check Attached=", jpype.isThreadAttachedToJVM())  
        object="java.lang:type=Threading"
        attribute= "ThreadCount"
        attr = connection.getAttribute(javax.management.ObjectName(object),attribute)
        return attr
    

    现在的问题是:如何防止 dcc.Interval 在每个时间间隔创建新线程?

    关于python - 使用 Plotly Dash for Python 进行 JBeans (JMX) 监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55400057/

    相关文章:

    python-3.x - 在 "Error loading layout"中使用 nginx 在 twisted 上代理破折号

    python - 如何将值更改为零但不在循环的第一次迭代中

    Python 同时变量递增

    python - 为什么 python 的 matlab.engine 这么慢?

    Python plotly |禁用具有子图的图形中的所有范围 slider

    python - 将水平线添加到 Dash-Plotly Python 仪表板

    python - 在 python 脚本中检查正在运行的 python 脚本

    jmx - 有没有办法启用 Caffeine MBean 注册?

    java - JConsole Web 应用程序

    java - 可以将命令属性写入文件中