SlideShare a Scribd company logo
OpenStack - Python-проект в 12 миллионов
строк. История проекта, комьюнити,
библиотеки и интересные решения
Пономарев Вадим
2
Кто я?
3
Что такое Openstack
● совместная разработка Rackspace и NASA
● первый релиз 21 октября 2010
● написан на Python
● лицензия Apache License 2.0
● в настоящее время управляется Openstack Foundation
История
4
Миссия
5
"to produce the ubiquitous Open Source Cloud Computing platform that will meet
the needs of public and private clouds regardless of size, by being simple to
implement and massively scalable"
Архитектура
6
Микросервисы
7
https://www.openstack.org/project-mascots/
Маскоты
8
https://www.openstack.org/software/
Что делает OpenStack
9
● China Mobile
● eBay
● CERN
● Volkswagen AG
● AT&T
● VEXXHOST
● Adobe
● American Airlines
● Walmart
● Nike
● Oath/Yahoo!
● ...
https://www.openstack.org/user-stories
Кто использует?
10
● > 12 млн. строк кода
● > 1 млн. коммитов
● > 15 000 контрибьюторов
● > 1500 проектов в целом
● 975 проектов Python
Размер в цифрах
11
Вклад комьюнити – Stackalytics
12 https://www.stackalytics.com/
Red Hat Other companies
VMware
Independent
developers
AT&T
Huawei
Canonical
Rackspace
SUSE
IBM
Вклад комьюнити – Stackalytics
13 https://www.stackalytics.com/
Разработка
14 https://docs.openstack.org/infra/manual/developers.html
Релизы
https://docs.openstack.org/project-team-guide/stable-branches.html#maintenance-phases
15
Управление версиями на примере релиза "Rocky"
https://docs.openstack.org/project-team-guide/stable-branches.html#maintenance-phases
https://github.com/openstack/requirements/blob/stable/rocky/upper-constraints.txt
https://specs.openstack.org/openstack/openstack-specs/specs/requirements-management.html
16
Ревью кода
https://docs.openstack.org/infra/manual/core.html
17
Devstack – маленький OpenStack для разработчиков
https://docs.openstack.org/devstack/latest/
$ sudo useradd -s /bin/bash -d /opt/stack -m stack
$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
$ sudo su - stack
$ git clone https://git.openstack.org/openstack-dev/devstack
$ cd devstack
$ vim local.conf
[[local|localrc]]
ADMIN_PASSWORD=secret
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
$ ./stack.sh
18
Библиотеки OpenStack – Oslo
https://wiki.openstack.org/wiki/Oslo#Libraries
19
Mission Statement:
To produce a set of python libraries containing code shared by OpenStack projects. The
APIs provided by these libraries should be high quality, stable, consistent, documented and
generally applicable.
Oslo.concurrency
https://docs.openstack.org/oslo.concurrency/latest/user/index.html
● Утилиты для синхронизации
● WatchDog для контроля внешних вызовов
● Синхронизация cross-service по namespace
20
Oslo.concurrency
https://docs.openstack.org/oslo.concurrency/latest/user/index.html
from oslo_concurrency import lockutils
from oslo_concurrency import watchdog
@lockutils.synchronized('not_thread_safe')
def not_thread_safe():
pass
with watchdog.watch(LOG, "subprocess call", logging.ERROR):
subprocess.call("sleep 10", shell=True)
print("done")
21
Oslo.log
● Свои formatter
● Свои handlers
● Логирует context
● Поддерживает oslo_config
https://docs.openstack.org/oslo.log/latest/
22
Oslo.log
[handler_stdout]
class = oslo_log.handlers.ColorHandler
args = (sys.stdout,)
formatter = context
[formatter_context]
class =
oslo_log.formatters.ContextFormatter
https://docs.openstack.org/oslo.log/latest/
23
Oslo.log
from oslo_context import context
from oslo_log import log as logging
LOG = logging.getLogger(__name__)
context.RequestContext(
user='6ce90b4d',
tenant='d6134462',
domain='a6b9360e')
LOG.debug("Oslo Logging")
LOG.info("Oslo Logging")
LOG.warning("Oslo Logging")
LOG.error("Oslo Logging")
LOG.critical("Oslo Logging")
https://docs.openstack.org/oslo.log/latest/
24
Oslo.log
2019-01-15 14:59:07,787.787 324 DEBUG __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01
6ce90b4d d6134462 a6b9360e - -] Oslo Logging <module> ./check_oslo_log.py:24
2019-01-15 14:59:07,788.788 324 INFO __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01 6ce90b4d
d6134462 a6b9360e - -] Oslo Logging
2019-01-15 14:59:07,789.789 324 WARNING __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01
6ce90b4d d6134462 a6b9360e - -] Oslo Logging
2019-01-15 14:59:07,790.790 324 ERROR __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01
6ce90b4d d6134462 a6b9360e - -] Oslo Logging
2019-01-15 14:59:07,790.790 324 CRITICAL __main__ [req-e356c9f4-cf3a-4739-a78d-5cae23aceb01
6ce90b4d d6134462 a6b9360e - -] Oslo Logging
https://docs.openstack.org/oslo.log/latest/
25
Oslo.messaging
● RabbitDriver
● ProtonDriver
● KafkaDriver
class TestClient(object):
def __init__(self, transport):
target = oslo_messaging.Target(
topic='test-topic', version='2.0')
self._client = oslo_messaging.RPCClient(
transport, target)
def do_something(self, ctxt, arg):
return self._client.call(
ctxt, 'do_something', arg=arg)
https://docs.openstack.org/oslo.messaging/latest/
26
Oslo.messaging
class TestEndpoint(object):
def do_something(self, ctx, arg):
return arg
transport = oslo_messaging.get_rpc_transport(cfg.CONF)
target = oslo_messaging.Target(
topic='test-topic', server='server1', version='2.0')
endpoints = [TestEndpoint()]
server = oslo_messaging.get_rpc_server(
transport, target, endpoints, executor='eventlet')
https://docs.openstack.org/oslo.messaging/latest/
27
Oslo.policy
from oslo_policy import policy
from oslo_config import cfg
enforcer = policy.Enforcer(
cfg.CONF, policy_file="policy.json")
base_rules = [
policy.RuleDefault('admin_required',
'role:admin'),
policy.RuleDefault('service_role',
'role:service'),
]
enforcer.register_defaults(base_rules)
https://docs.openstack.org/oslo.policy/latest/
● учитывает context
● учитывает тело запроса
● учитывает тело ответа
● policy хранятся в файле
● поддерживается reload
файла с policy
28
Oslo.policy
# Add policy
enforcer.register_default(
policy.DocumentedRuleDefault(
name='service:create_foo',
check_str='role:admin',
scope_types=['project'],
operations=[
{
'path': '/v1/foo/',
'method': 'POST'
}
]
)
)
https://docs.openstack.org/oslo.policy/latest/
29
Oslo.service и Cotyledon
https://docs.openstack.org/oslo.service/latest/
https://github.com/sileht/cotyledon
● Запуск нескольких процессов/потоков
● Обработчики сигналов
● API для child- и parent-процессов
● Запуск периодических задач
30
Oslo.service и Cotyledon
from oslo.service import service
class MyService(service.Service):
def __init__(self, conf):
self.master_pid = os.getpid()
self.queue = multiprocessing.Queue()
def start(self):
pass
def stop(self):
pass
def restart(self):
pass
https://docs.openstack.org/oslo.service/latest/
https://github.com/sileht/cotyledon
31
Oslo.service и Cotyledon
https://docs.openstack.org/oslo.service/latest/
https://github.com/sileht/cotyledon
service = MyService(conf)
launcher = service.launch(
conf, service, workers=2,
restart_method='reload')
launcher.launch_service(
MyOtherService(),
worker=conf.other_workers)
launcher.wait()
32
Oslo.report (Guru Meditation report)
https://docs.openstack.org/oslo.reports/latest/user/usage.html
from oslo_reports import guru_meditation_report as gmr
gmr.TextGuruMeditation.setup_autorun(version='13.0.0')
# kill -SIGUSR2 <process_id>
● показывает текущую конфигурацию (oslo_config)
● показывает threads и текущую точку выполнения
● показывает green threads (eventlet) и текущую точку выполнения
● Показывает процессы и их статусы
33
OsProfiler
https://docs.openstack.org/osprofiler/latest/user/api.html
● кросс-сервисное профилирование
● минимальное изменение исходного кода
● возможность полностью выключить
● возможность включить в продакшне без
потери производительности
34
OsProfiler
https://docs.openstack.org/osprofiler/latest/user/api.html
from osprofiler import profiler
def some_func():
profiler.start("point_name", {"any_key": "with_any_value"})
# your code
profiler.stop({"any_info_about_point": "in_this_dict"})
# OR
@profiler.trace("point_name",
info={"any_info_about_point": "in_this_dict"},
hide_args=False)
def some_func2(*args, **kwargs):
pass
35
OsProfiler
https://docs.openstack.org/osprofiler/latest/user/api.html
$ openstack --os-profile SECRET_KEY baremetal node list
Trace ID: c900bc0-8355-4602-9128-26bba5c5774f
$ osprofiler trace show --html c900bc0-8355-4602-9128-
26bba5c5774f --out trace.html
36
OsProfiler
https://docs.openstack.org/osprofiler/latest/user/api.html
37
OsProfiler
https://docs.openstack.org/osprofiler/latest/user/api.html
38
Аналоги OsProfiler
● Zipkin (http://zipkin.io/)
● Dapper (https://ai.google/research/pubs/pub36356)
● Jaeger (https://www.jaegertracing.io/)
● OpenTracing (https://opentracing.io/)
39
Stevedore
https://docs.openstack.org/stevedore/latest/user/patterns_loading.html
Driver
Hook
Extensions
40
Stevedore – API драйвера
https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html
# my_app/drivers/base_api.py
import abc
import six
@six.add_metaclass(abc.ABCMeta)
class DriverBase(object):
@abc.abstractmethod
def format(self, data):
pass
41
Stevedore – Код драйвера и алиас
https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html
from my_app.drivers import base_api
class TestDriver(base_api.DriverBase):
def format(self, data):
pass
setup(
entry_points={'my_app.drivers': [
'test_driver = my_app.drivers.test_driver:TestDriver']}
Drive
r
setup.py
42
Stevedore – Использование драйвера
https://docs.openstack.org/stevedore/latest/user/tutorial/loading.html
# use_driver.py
from stevedore import driver
mgr = driver.DriverManager(
namespace='my_app.drivers',
name='test_driver',
invoke_on_load=True,
)
print(mgr.driver.format({}))
43
# my_app.egg-info/entry_points.txt
[my_app.drivers]
test_driver = my_app.drivers.test_driver:TestDriver
Taskflow – Flow-Based programming
44
● описывает декларативные процессы
● ведет контроль состояния
выполнения (контрольные точки)
● переносит данные между
несколькими workflow / task
● горизонтально масштабируется
● поддерживает удаленное
выполнение
● поддерживает версионирование flow
и task
https://docs.openstack.org/taskflow/latest/user/index.html
Taskflow – Flow-Based programming
45 https://docs.openstack.org/taskflow/latest/user/index.html
Taskflow – Flow-Based programming
46 https://docs.openstack.org/taskflow/latest/user/index.html
Q&A
47
● velizarx@gmail.com
● https://t.me/velizarx
● https://www.linkedin.com/in/vadim-ponomarev-53671538/

More Related Content

Similar to OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019)

Openstack
OpenstackOpenstack
Openstack
Nick Mishin
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
GetDev.NET
 
Операционные системы и среды
Операционные системы и средыОперационные системы и среды
Операционные системы и среды
Alexandr Konfidentsialno
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
aviatakz
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
Andrey Kazarinov
 
PostSharp - Threading Model Library
PostSharp - Threading Model LibraryPostSharp - Threading Model Library
PostSharp - Threading Model Library
Andrey Gordienkov
 
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
LogeekNightUkraine
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
Кирилл Толкачёв
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Oleg Nenashev
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
Igor Shkulipa
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
Andrey Markelov
 
Что нового в Android 5.0
Что нового в Android 5.0Что нового в Android 5.0
Что нового в Android 5.0
Kirill Danilov
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
Denis Izmaylov
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
Mikhail Chinkov
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
Александр Сигачев
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
Denis Latushkin
 
Android: Как создать свое первое приложение?
Android: Как создать свое первое приложение?Android: Как создать свое первое приложение?
Android: Как создать свое первое приложение?Kuban Dzhakipov
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Mikhail Davydov
 

Similar to OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019) (20)

Openstack
OpenstackOpenstack
Openstack
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
 
Операционные системы и среды
Операционные системы и средыОперационные системы и среды
Операционные системы и среды
 
Python Development process in Yandex
Python Development process in YandexPython Development process in Yandex
Python Development process in Yandex
 
Процессы разработки в Яндексе
Процессы разработки в ЯндексеПроцессы разработки в Яндексе
Процессы разработки в Яндексе
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
PostSharp - Threading Model
PostSharp - Threading ModelPostSharp - Threading Model
PostSharp - Threading Model
 
PostSharp - Threading Model Library
PostSharp - Threading Model LibraryPostSharp - Threading Model Library
PostSharp - Threading Model Library
 
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
Andrii Medvedchuk "Kubernetes and Docker Basics for Running Web Apps"
 
Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016Эволюционный дизайн. Joker Students Day 2016
Эволюционный дизайн. Joker Students Day 2016
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.C++ Базовый. Занятие 15.
C++ Базовый. Занятие 15.
 
OpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельностиOpenStack и Docker: вместе и по отдельности
OpenStack и Docker: вместе и по отдельности
 
Что нового в Android 5.0
Что нового в Android 5.0Что нового в Android 5.0
Что нового в Android 5.0
 
Микросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и KubernetesМикросервисная архитектура на базе CoreOS и Kubernetes
Микросервисная архитектура на базе CoreOS и Kubernetes
 
IT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчикаIT-инфраструктура. FAQ для разработчика
IT-инфраструктура. FAQ для разработчика
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
NPM и модульная архитектура приложения
NPM и модульная архитектура приложенияNPM и модульная архитектура приложения
NPM и модульная архитектура приложения
 
Android: Как создать свое первое приложение?
Android: Как создать свое первое приложение?Android: Как создать свое первое приложение?
Android: Как создать свое первое приложение?
 
Introduction in Node.js (in russian)
Introduction in Node.js (in russian)Introduction in Node.js (in russian)
Introduction in Node.js (in russian)
 

OpenStack - Python Project with 12 Million Lines of code (RUS, Moscow Python Conf++ 2019)

Editor's Notes

  1. Это система для построения облачной инфраструктуры и управления пулами различных ресурсов: compute (виртуальные машины, контейнеры, bare-metal), storage, сетевыми ресурсами. Система позволяет управлять тысячами серверов как единым облаком, даже если эти сервера находятся в разных дата-центрах.
  2. Openstack - это совместный проект начатый компаниями Rackspace и NASA в 2006 году. Первый релиз состоялся в 2010. В 2012 году была создана некоммерческая организация Openstack Foundation для развития проекта и его комьюнити. В настоящий момент более 600 компаний занимаются его разработкой, комьюнити насчитывает более 15000 разработчиков.
  3. Основная миссия проекта: Создать облачную Open Source платформу которая будет соответствовать всем требованиям публичных и частных облаков вне зависимости от их размера.
  4. Проект состоит из множества компонент. Каждый компонент - это отдельный репозиторий на github, со своей командой, со своей roadmap, core разработчиками, со своими правилами разработки, митингами и прочим. Каждый компонент выполняет определенную задачу. Например базовый-компонент Nova занимается всем что связано с compute ресурсами, то есть запускает виртуальные машины, управляет их настройками, миграциями и т.д. Другой базовый компонент Neutron занимается всем что связано с сетью: создает сети, адреса и управляет ими. В настоящий момент таких отдельных компонент-проектов больше 70.
  5. Каждый компонент в свою очередь состоит из нескольких микросервисов и демонов запускаемых на разных серверах облака. Одни микросервисы выполняют роль REST API серверов, другие - worker-ы выполняют задания, третьи занимаются мониторингом, четвертые сбором мусора и освобождением ресурсов. В каждом отдельном компоненте количество таких микросервисов может достигать 20ти штук.
  6. Также в сообществе Openstack принято давать каждому компоненту маскот - какое нибудь животное. Полный список можно найти по ссылке.
  7. Микросервисная архитектура и четкое разделение функциональности на компоненты позволяет на базе OpenStack строить различные сервисы собирая их как конструктор. На базе OpenStack можно построить инфраструктуру для целой компании-провайдера причем услуги предоставляемые провайдером могут сильно отличаться друг от друга.
  8. Среди таких компаний - пользователей OpenStack множество крупных знаменитых компаний из различных областей.
  9. Сейчас опенстек это почти 1000 репозиториев с кодом на Python и множество дополнительных инструментов, от средств аркистрации в готовом репозитории ansible до собственного CI “Zuul” заточенного под тестирование OpenStack.
  10. Для сбора статистики по вкладу в разработку такого большого проекта OpenStack комьюнити написало отдельный проект в котором ведется подсчет всего связанного с разработкой, от ревью кода одного человека до вклада каждой компании в целом в проект. На слайде диаграмма с этого сайта со статистикой вклада в проект по компаниям. Обратите внимание что 27 с небольшим процентов - это разработчики не привязанные к компании, то есть свободные разработчики.
  11. Это статистика по количеству строк кода от отдельных разработчиков. В топе очень преданные делу разработчики :)
  12. OpenStack с первых дней разрабатывался как Open Source проект и процесс разработки в комьюнити отлажен как часы. Есть документации которая сможет ответить на все вопросы разработчика. В документации можно найти информацию обо всем, как ревьюить код, как его писать, как работает CI и т.д. В проекте предъявляются высокие требования к качеству кода и его стабильности, поэтому все изменения проходят через систему ревью и массу тестов от запуска unit тестов до интеграционного тестирования в реальных дата-центрах.
  13. Раз в пол года комьюнити формирует релиз (каждая команда каждого компонента формирует релиз с кодовым названием у себя). В дальнейшем до 18 месяцев ведется поддержка этого релиза с правками багов.
  14. В каждом релизе замораживаются определенные версии не только самих компонент OpenStack но и версии библиотек с указанием максимальной версии каждой библиотеки которая может быть в этом релизе. Делается это с помощью файла upper-constraints.txt который также формируется под каждый релиз. Таким образом все компоненты работают на заранее обговоренных версиях библиотек, что гарантирует стабильность и дает возможность запустить все компоненты в одном пространстве на используя контейнеризацию или virutalenv. Кстати поддержка constraints file в pip была добавлена сообществом OpenStack. Два раза в год все core команды всех компонент собираются вместе на PTG (Project Team Getherings) для обсуждения целей на следующий релиз.
  15. При ревью кода в комьюнити тоже свои стандарты. После пуша кода в gerrit происходит запуск тестов. Тесты могут занять несколько дней, так как иногда полностью разворачивается маленький OpenStack. После того как тесты пройдены в ченж добавляются ревьюеры. Core-reviewer может поставить +2 тем самым разрешив мержить, обычные же разработчики комьюнити могут поставить только +1 либо написать комментарии и поставить -1.
  16. Для разработки такой сложной микросервисной системы как OpenStack нужно хорошо понимать как компоненты связаны между собой и уметь тестировать эти связи. Но для этого надо установить весь OpenStack. Для упрощения жизни разработчикам комьюнити создало проект devstack который позволяет запуститься OpenStack у себя локально на компьютере и начать разработку.
  17. Комьюнити поддерживает 35 собственных библиотек которые объединены общим названием oslo. ОСновная цель создания библиотеки как всегда: избежать копи-паста в проектах и вынести все в отдельные модули.
  18. Библиотека предоставляет несколько инструментов для написания безопасных многопоточных и многопроцессорных приложений. Например декораторы для синхронизации или вотчдог для контроля вызова подпроцессов или выполнения длительных операций.
  19. Библиотека реализована так что необходимую функциональность можно получить в одну строку.
  20. Библиотека предоставляет обертку над стандартной библиотекой логирования с теми же интерфейсами, а также несколько дополнительных хендлеров, нативную поддержку контекста openstack и авторизационных данных при логировании.
  21. В примере на слайде показано как двумя строками можно включить логирование с подсветкой, для этого используются хендлер и формартер из библиотеки.
  22. Так как библиотека имеет нативную поддержку контекста OpenStack что очень помогает для поиска проблем на проде.
  23. В результате в логе будет что-то такое.
  24. Библиотека предоставляет два API: первое клиент-сервер RPC (oslo.messaging.rpc), второе API для генерации и получения нотификаций (oslo.messaging.notify). В обоих случаях библиотека предоставляет простой интерфейс, обработчик ошибок, поддержку версий, поддержку нескольких backend шин для передачи сообщений. На слайде пример RPC клиента
  25. А так будет выглядеть сервер, то есть исполнитель RPC запросов для этих сообщений. Несколько строк которые позволяют получить сообщение из RabbitMQ например и запустить исполнение.
  26. Библиотека предоставляет инструмент для управления политиками доступа на уровне API или определенных методов в коде. Обладает очень большой гибкостью, можно настраивать политики по ролям, по параметрам контекста, по отдельным полям данных и т.д. Позволяет хранить политики в виде JSON файла и обновлять их на лету.
  27. Это пример инициализации дефолтных политик для одного эндпоинта API.
  28. Библиотеки для создания сервисов работающих длительное время в системе. Позволяет запускать многопоточные и многопроцессорные сервисы, обрабатывать системные сигналы, делать graceful restart, запускать периодические задачи. Библиотека Cotyledon была написана также сообществом openstack но менее заточена под работу только с Openstack.
  29. На слайде шаблон для создания сервиса, который имеет очередь обработчиков.
  30. Так выглядит запуск этого сервиса.
  31. Библиотека для отладки многопоточных сервисов которые запущены длительное время. Позволяет без перезагрузки сервиса получить отчет в котором будет информация о текущем конфиге, запущенных потоках и процессах с указанием их точки выполнения. Эта библиотека помогает проводить отладку основных сервисов OpenStack в которых как правило больше 10 запущенных процессов.
  32. Библиотека позволяет выполнять кросс-сервисное профилирование, что очень важно когда в проекте несколько сотен отдельно работающих микросервисов. Во всех базовых сервисах OpenStack точки профилирования уже есть, но также их можно добавить в любой место добавлением нескольких строк.
  33. Апи библиотеки позволяет строить точку получения информации для профайлера в любое место парой строк.
  34. После чего профилирование можно запускать как часть CLI команды OpenStack.
  35. В итоге будет сформирована такая карта вызовов, в которой видно какой сервис участвовал в выполнении задачи, сколько это заняло времени.
  36. Также можно посмотреть детали каждой отдельной части. Эта детальная информация как раз может содержать любую вашу информацию из точки профилирования.
  37. Существуют аналоги OsProfiler но не заточенные под OpenStack. Все они позволяет производить подобное профилирование в микросервисной системе,
  38. Эта библиотека была разработана комьюнити OpenStack но не заточена под него и может быть использована в любом проекте. Библиотека позволяет создавать модульные приложения с различными типами расширений. Библиотека предоставляет три типа расширений: Driver - представляет из себя основную функциональность которая может быть включена. Основной момент: только один драйвер может быть включен в один момент в одном неймспейсе. Extension - или по другому плагины - функциональность которая работает параллельно в одном приложении в одном месте, но выполняет разные задачи Hook - функциональность которая выполняется при получении определенного события
  39. Пример создания драйвера для приложения. По шагам: описываем API драйвера обозначая основные методы и что должны передать туда.
  40. пишем сам драйвер который соответсвует созданному ранее интерфейсу и создаем alias для драйвера в entry_points
  41. После установки пакета этот драйвер будет доступен для любого приложения на Python нужно только знать namespace и alias драйвера. Таким образом приложения и сервисы написанные с использованием stevedore могут быть расширены сторонними программистами без изменения основного кода. Библиотека Stevedore используется практически во всех сервисах OpenStack.
  42. Библиотека требует в зависимостях oslo_utils и oslo_serialization, но не привязана к OpenStack и активно используется в других проектах. Библиотека позволяет создавать декларативные workflow с контролем состояния выполнения каждого отдельного таска а также возможностью отката изменений если один из тасков сфейлился. Также есть поддержка удаленного запуска отдельных задач.
  43. Библиотека используется при выполнении длительных и сложных операций, как правило с взаимодействием между различными сервисами. Один такой flow может выполняться несколько десятков минут и важно достигнуть необходимого результата, при этом если что-то пошло не так, все выполненные ранее шаги будут откатываться к первоначальному состоянию, что обеспечивает консистентность данных.
  44. Также средствами самой библиотеки можно генерировать график flow. Это не график предыдущей схемы, а пример флоу из документации но думаю суть ясна.
  45. Подключайтесь к разработке OpenStack и станьте частью большого комьюнити. Если возникнут проблемы со стартом, всегда можете написать мне, я расскажу с чего начать и как. Вопросы.