Отображать сообщения журнала бэкенда в Plotly Dash - PullRequest
0 голосов
/ 25 марта 2019

В настоящее время я использую Plotly Dash для разработки панели мониторинга для службы на основе JVM (Kotlin).По сути, служба JVM отправляет сообщения (через ZMQ) в мой сценарий Python Dash, который, в свою очередь, обновляет серию живых диаграмм.

Больше, чем диаграммы, я также хотел бы отображать сообщения журнала службы вПанель инструментов Dash (в настоящее время они отображаются в консоли и записываются в файл).Я могу легко изменить приложение JVM / скрипт Python для отправки / получения сообщений через ZMQ, но мне не удалось найти компонент Dash, который мог бы отображать эти сообщения в реальном времени.

Поскольку существуетдовольно высокая пропускная способность сообщений (несколько десятков в секунду), я хотел бы иметь возможность фильтровать сообщения по уровню (информация, предупреждения и т. д.) и, возможно, по другим критериям (регулярное выражение будет идеальным).Я прочитал документацию по Dash, но не смог найти компонент, который бы соответствовал моим потребностям.Есть ли способ добиться этого в Dash?

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 25 марта 2019

Я не знаком с тем, как вы будете получать сообщения в сценарии, но вы хотите использовать что-то, связанное с:

  • Обычным html.Div(id='log-div',style=dict(height='300px',overflow='auto')), которыйэто просто пустой div с возможностью прокрутки

  • Функция обратного вызова, которая выглядит примерно так:

@app.callback(
  Output('log-div','children'),
  [Input('log-div','children')
)
def log_content(old_logs):
    # wait for whatever time interval you want between updating the messages
    time.sleep(2)

    # take in the messages through some function
    messages = receive_messages_function()

    # filter the messages here
    messages = filter_messages_function()

    # old_logs is a list of the old messages, with each line being a 
    # separate div (to separate the messages, this can be done in many different ways).
    # So what you do is add the new filtered messages to the old filtered messages
    # Note - this assumes the messages are in a list of some sort; it doesn't matter
    # as the concept is the same - just add the new messages after the old ones
    messages = old_logs + messages

    return messages   

Это будет работать, но вы бынеобходимо убедиться, что sleep() ing не мешает работе остальной части приложения (т. е. передать threaded=True в app.run_server () или сконфигурировать объект сервера для потоковой обработки.

Надеюсь, это поможет! Комментируйте любые вопросы / отзывы, и я с удовольствием отвечу.

...