Мониторинг JBeans (JMX) с помощью Plotly Dash для Python - PullRequest
1 голос
/ 28 марта 2019

Я пытаюсь использовать тире для мониторинга в реальном времени атрибутов JBeans.При использовании dcc.Interval программа закрывается автоматически после первой попытки POST / _dash-update-component.

  • Python 3.6
  • Dash 1.0.2

Iподключен к Jconsole.Ссылка на атрибуты Jbean и извлечение значений работает.Это работает даже при первом запуске dash-приложения, но затем, когда Interval срабатывает, dash-программа закрывается.

  • 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
DASH MODULE
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) ОЖИДАЕМЫЕ РЕЗУЛЬТАТЫ

--- вывод командной строки:

Программа должна выполнять POST каждые 10 секунд и никогда не заканчиваться

--- DASHBOARDВЫХОД:

Номера должны обновляться каждые 10 секунд

РАБОЧАЯ, пробная версия: 0;XXX (любое число) РАБОЧАЯ, пробная: 1;XXY WORKING, испытание: 2;XXZ

1 Ответ

0 голосов
/ 18 апреля 2019

Если кому-то будет интересно - я нашел частичное решение. Ошибка, вызванная 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 через каждый интервал?

...