Рубрики
Uncategorized

Jupyterhub Витрина: Развлечения разведки

Включение данных из программного обеспечения разработки и процессов доставки в действующее понимание, как BI делает для бизнеса. Теги с Showdev, DevOps, Datascity, Jupyter.

Первоначально опубликовано в 2019 году как Развлекая интеллект в Джупитер Блог .

Развлекая интеллект Включает данные о разработке и доставке программного обеспечения и процессов доставки в действующее понимание, как BI делает для бизнеса. Jupyter — это идеальный инструмент для этого, с его комбинацией мощных сред кодирования и пользовательский интерфейс, облегчающий эксперименты с ультракороткими циклами обратной связи.

Настройка на основе Jupyter поддерживает анализ рисков и принятия решений в процессах разработки и операций — типичные процедуры управления бизнес-аналитикой/данными могут быть применены к «Бизнесу создания программного обеспечения». Идея состоит в том, чтобы создать петли обратной связи и содействовать принятию человеческих решений путем автоматического обеспечения надежного ввода в виде современных фактов. Ведь разработка является нашим бизнесом — поэтому давайте укажем KPI для разработки, выпуска и операционного программного обеспечения.

Типичные использования

Вот некоторые очевидные области применения, где анализ данных может быть полезен на технической стороне.

  • Миграционные процессы всех видов (текущее состояние, отслеживание прогресса, достижение целей)
  • Инвентаризация отчетности для повышенной прозрачности и поддержки оперативных решений
  • Автоматизация процессов внутренней отчетности, чтобы освободить скудные активы и опыт человека

Архитектура платформы

Простой Jupyterhub SETUP может позволить вам сделать анализ на своих уже доступных, но недоступных и едва понимаемых данных, без каких-либо великих усилий или капитала. Добавляя один хост Jupyterhub, вы можете использовать встроенный ядр Python3 для доступа к существующим источникам внутренних данных.

Следующая диаграмма показывает, какую роль Jupyterhub может играть в существующей среде.

Чтобы сделать такое развертывание легко, 1and1/Debianized-Jupyterhub Проект предоставляет услугу Jupyterhub, включая полностью оборудованное ядро Python3 в качестве единого пакета Debian — только Python3, Nodejs и пакеты Chromium должны быть установлены в дополнение к jupyterhub один. Если вы подняли бровь на хром-хроме в этом списке, он используется каркасами визуализации на основе JavaScript для рендеринга PNG-изображений.

В том числе Nginx-Powered SSL Off-погрузчик , Полная настройка можно сделать в течение часа.

Корпус использования: миграционная отчетность

На момент написания этого письма (начало 2019 года) широко распространенная задача — миграция из Oracle Java для других поставщиков, а также начать миграцию с Java 8 до новых версий (Java 11). Если вы делаете это в масштабе во многих машинах и командах, вам определенно нужна какое-то управление, а постоянная обратная связь по текущему состоянию и скорости прогресса.

Далее следует выдержка из продуктивной ноутбуки с анонимными данными о Утверждать Развертывание. Что данные изначально были извлечены из системы, называемой «Отчет о управлении патчами» , который собирает информацию о установленных пакетах для всех хозяев в центре обработки данных. Мы в желтом «Источники данных» Коробка вышеуказанного рисунка здесь.

Во-первых, мы читаем данные и покажу наборы значений категорических колонн, а также образец.

import numpy as np
import pandas as pd

raw_data = pd.read_csv("../_data/cmdb-aoj.csv", sep=',')
print('♯ of Records: {}\n'.format(len(raw_data)))

for name in raw_data.columns[1:]:
    if not name.startswith('Last '):
        print(name, '=', list(sorted(set(raw_data[name].fillna('')))))

print(); print(raw_data.head(3).transpose())
♯ of Records: 104

Distribution = ['Debian 8.10', 'Debian 8.11', 'Debian 8.6', 'Debian 8.9',
                'Debian 9.6', 'Debian 9.7', 'Debian 9.8']
Architecture = ['amd64']
Environment = ['--', 'DEV', 'LIVE', 'QA']
Team = ['Team Blue', 'Team Green', 'Team Red', 'Team Yellow']
Installed version = ['11.0.2.9-83(amd64)', '11.0.2.9-85(amd64)', '8.202.b08-66(amd64)',
                     '8.202.b08-83(amd64)', '8.202.b08-85(amd64)']

                                    0                   1                   2
CMDB_Id                     108380195           298205230           220678839
Distribution              Debian 8.11          Debian 9.6         Debian 8.11
Architecture                    amd64               amd64               amd64
Environment                       DEV                  --                 DEV
Team                         Team Red            Team Red            Team Red
Last seen            2019-03-18 06:42    2019-03-18 06:42    2019-03-18 06:42
Last modified        2019-03-18 06:42    2019-03-18 06:42    2019-03-18 06:42
Installed version  11.0.2.9-83(amd64)  11.0.2.9-83(amd64)  11.0.2.9-83(amd64)

Далее поступает обычные данные очистки данных. Распределение Столбец немного разнообразна, и не у всех есть кодовые знамена Debian, а соответствующие основные версии запоминаются. map_distro Функция исправляет это.

def map_distro(name):
    """Helper to create canonical OS names."""
    return (name.split('.', 1)[0]
        .replace('Debian 7', 'wheezy')
        .replace('Debian 8', 'jessie')
        .replace('Debian 9', 'stretch')
        .replace('Debian 10', 'buster')
        .replace('squeeze', 'Squeeze [6]')
        .replace('wheezy', 'Wheezy [7]')
        .replace('jessie', 'Jessie [8]')
        .replace('stretch', 'Stretch [9]')
        .replace('buster', 'Buster [10]')
    )

Вместе с другими шагами очистки функция Mapper применяется в A DFPLY трубопровод. Результат можно контролировать, показывая образец точек данных с уникальными номерами версий.

from dfply import *

cleaned = (raw_data
    >> mutate(Version=X['Installed version'].str.split('[()]', 1, expand=True)[0])
    >> mutate(Environment=X.Environment
              .fillna('--').str.replace('--', 'N/A').str.upper())
    >> mutate(Distribution=X.Distribution.apply(map_distro))
    >> drop(X.CMDB_Id, X['Last seen'], X['Last modified'], X['Installed version'])
)

print((cleaned >> distinct(X.Version)).transpose())
                       0            13            14            62  \
Distribution   Jessie [8]  Stretch [9]    Jessie [8]   Stretch [9]
Architecture        amd64        amd64         amd64         amd64
Environment           DEV          N/A           DEV           DEV
Team             Team Red    Team Blue      Team Red     Team Blue
Version       11.0.2.9-83  11.0.2.9-85  8.202.b08-83  8.202.b08-85

                        68
Distribution    Jessie [8]
Architecture         amd64
Environment            DEV
Team             Team Blue
Version       8.202.b08-66

Время представить очищенные данные, начиная с таблицы команд и их количества установленных пакетов. В производственной ноутбуке API корпоративного управления идентификацией используется для обогащения таблицы с контактными данными команды. Наличие организационных данных также позволяет фильтровать или составлять данные по бизнес-единицам.

counts = cleaned.groupby(['Team']).size()
print(counts.reset_index(name='Count'))
          Team  Count
0    Team Blue     42
1   Team Green     16
2     Team Red     45
3  Team Yellow      1

Чтобы создать тепловую карту того, насколько разнообразна спектр версий команды, мы рассчитываем процент версий на команду.

percentage = cleaned.groupby(['Team', 'Version']).size().reset_index(name='Count')
percentage = percentage.assign(Percent=
    percentage.apply(lambda x: 100.0 * x[-1] / counts[x[0]], axis=1))
print(percentage.head(3))
        Team       Version  Count    Percent
0  Team Blue   11.0.2.9-85      1   2.380952
1  Team Blue  8.202.b08-66      1   2.380952
2  Team Blue  8.202.b08-85     40  95.238095

Холовым просмотвам Делает создание тепломапа, включая этикетку наложить ветер.

import holoviews as hv
hv.extension('bokeh')
publish = 1  # publishing or interactive mode?

heatmap = hv.HeatMap(percentage[['Version', 'Team', 'Percent', 'Count']]).opts(
    hv.opts.HeatMap(
        title='Version Distribution by Team',
        width=480, xrotation=25,
        zlim=(0, 100), cmap='kbc_r', clipping_colors=dict(NaN='#ffffe0'),
        colorbar=True, tools=['hover'], toolbar=None if publish else 'right',
    )
).sort()

label_dimension = hv.Dimension('Percent', value_format=lambda x: '%.1f' % x)
labels = hv.Labels(heatmap, vdims=label_dimension).opts(
    hv.opts.Labels(
        text_color='Percent',
        text_font_size='10pt',
        text_font_style='bold',
    )
)

chart = heatmap * labels

if publish:
    import time
    import phantomjs_bin
    from IPython.display import HTML, clear_output

    %env BOKEH_PHANTOMJS_PATH={phantomjs_bin.executable_path}
    chart_img = 'img/devops/aoj-heatmap.png'
    hv.save(chart, chart_img)
    chart = HTML(''.format(chart_img, time.time()))
    clear_output()

chart

Из тепловой карты вы можете легко взглянуть, использует ли команда преимущественно одной версией, а в том, как последние используемые версии являются.

Заключение

Использование платформы Powered by Проект Jupyter И большой кусок научного стека Python позволяет легко прессмировать ваши данные в нужную вам форму, а затем выбрать из широкого спектра вариантов визуализации, чтобы принести ваше сообщение.

👍 Кредиты изображений: DevOps-Toolchain

Оригинал: «https://dev.to/jhermann/a-jupyterhub-showcase-devops-intelligence-5ea»