Finish the tutorial

This commit is contained in:
Roman Mogylatov 2020-08-08 14:22:23 -04:00
parent 4e2c7f6483
commit 1c5059cd54
2 changed files with 120 additions and 13 deletions

View File

@ -100,7 +100,7 @@ Prepare the environment
In this section we are going to prepare the environment for running our daemon. In this section we are going to prepare the environment for running our daemon.
First, we need to specify the project requirements. We will use next packages: First we need to specify the project requirements. We will use next packages:
- ``dependency-injector`` - the dependency injection framework - ``dependency-injector`` - the dependency injection framework
- ``aiohttp`` - the web framework (we need only http client) - ``aiohttp`` - the web framework (we need only http client)
@ -485,10 +485,24 @@ Everything works properly. Dispatcher starts up and exits because there are no m
By the end of this section we have the application skeleton ready. In the next section will will By the end of this section we have the application skeleton ready. In the next section will will
add first monitoring task. add first monitoring task.
HTTP monitor Example.com monitor
------------ -------------------
Create ``http.py`` module in the ``monitoringdaemon`` package: In this section we will add the monitoring task that will check the availability of the
`http://example.com <http://example.com>`_.
We will start from the extending of our class model with a new type of the monitoring check, the
``HttpMonitor``.
The ``HttpMonitor`` is a subclass of the ``Monitor``. We will implement the ``check()`` method that
will send the HTTP request to the specified URL. The http request sending will be delegated to
the ``HttpClient``.
.. image:: asyncio_images/class_2.png
First, we need to create the ``HttpClient``.
Create ``http.py`` in the ``monitoringdaemon`` package:
.. code-block:: bash .. code-block:: bash
:emphasize-lines: 7 :emphasize-lines: 7
@ -522,6 +536,8 @@ and put next into it:
async with session.request(method, url) as response: async with session.request(method, url) as response:
return response return response
Now we need to add the ``HttpClient`` to the container.
Edit ``containers.py``: Edit ``containers.py``:
.. code-block:: python .. code-block:: python
@ -558,12 +574,12 @@ Edit ``containers.py``:
), ),
) )
Add the http monitor. Now we're ready to add the ``HttpMonitor``. We will add it to the ``monitors`` module.
Edit ``monitors.py``: Edit ``monitors.py``:
.. code-block:: python .. code-block:: python
:emphasize-lines: 4-5,7,24-58 :emphasize-lines: 4-5,7,20-54
"""Monitors module.""" """Monitors module."""
@ -620,6 +636,12 @@ Edit ``monitors.py``:
round(time_took, 3) round(time_took, 3)
) )
We have everything ready to add the `http://example.com <http://example.com>`_ monitoring check.
We make two changes in the container:
- Add the factory provider ``example_monitor``.
- Inject the ``example_monitor`` into the dispatcher.
Edit ``containers.py``: Edit ``containers.py``:
.. code-block:: python .. code-block:: python
@ -662,6 +684,9 @@ Edit ``containers.py``:
), ),
) )
Provider ``example_monitor`` has a dependency on the configuration options. Let's define these
options.
Edit ``config.yml``: Edit ``config.yml``:
.. code-block:: yaml .. code-block:: yaml
@ -679,22 +704,44 @@ Edit ``config.yml``:
timeout: 5 timeout: 5
check_every: 5 check_every: 5
All set. Start the daemon to check that all works.
Run in the terminal: Run in the terminal:
.. code-block:: bash .. code-block:: bash
docker-compose up docker-compose up
You will see: You should see:
.. code-block:: bash .. code-block:: bash
[INFO] [Dispatcher]: Starting up Starting monitoring-daemon-tutorial_monitor_1 ... done
[INFO] [HttpMonitor]: GET http://example.com, response code: 200, content length: 648, request took: 0.083 seconds Attaching to monitoring-daemon-tutorial_monitor_1
[INFO] [HttpMonitor]: GET http://example.com, response code: 200, content length: 648, request took: 0.062 seconds monitor_1 | [2020-08-08 17:06:41,965] [INFO] [Dispatcher]: Starting up
monitor_1 | [2020-08-08 17:06:42,033] [INFO] [HttpMonitor]: Check
monitor_1 | GET http://example.com
monitor_1 | response code: 200
monitor_1 | content length: 648
monitor_1 | request took: 0.067 seconds
monitor_1 |
monitor_1 | [2020-08-08 17:06:47,040] [INFO] [HttpMonitor]: Check
monitor_1 | GET http://example.com
monitor_1 | response code: 200
monitor_1 | content length: 648
monitor_1 | request took: 0.073 seconds
More monitors Our daemon can monitor `http://example.com <http://example.com>`_ availability.
-------------
Let's add the monitor for the `http://httpbin.org <http://httpbin.org>`_.
Httpbin.org monitor
-------------------
Adding of the monitor for the `httpbin.org`_ will be much easier because we have all the
components ready. We just need to create a new provider in the container and update the
configuration.
Edit ``containers.py``: Edit ``containers.py``:
@ -768,10 +815,59 @@ Edit ``config.yml``:
timeout: 5 timeout: 5
check_every: 5 check_every: 5
Let's start the daemon and check the logs.
Run in the terminal:
.. code-block:: bash
docker-compose up
You should see:
.. code-block:: bash
Starting monitoring-daemon-tutorial_monitor_1 ... done
Attaching to monitoring-daemon-tutorial_monitor_1
monitor_1 | [2020-08-08 18:09:08,540] [INFO] [Dispatcher]: Starting up
monitor_1 | [2020-08-08 18:09:08,618] [INFO] [HttpMonitor]: Check
monitor_1 | GET http://example.com
monitor_1 | response code: 200
monitor_1 | content length: 648
monitor_1 | request took: 0.077 seconds
monitor_1 |
monitor_1 | [2020-08-08 18:09:08,722] [INFO] [HttpMonitor]: Check
monitor_1 | GET https://httpbin.org/get
monitor_1 | response code: 200
monitor_1 | content length: 310
monitor_1 | request took: 0.18 seconds
monitor_1 |
monitor_1 | [2020-08-08 18:09:13,619] [INFO] [HttpMonitor]: Check
monitor_1 | GET http://example.com
monitor_1 | response code: 200
monitor_1 | content length: 648
monitor_1 | request took: 0.066 seconds
monitor_1 |
monitor_1 | [2020-08-08 18:09:13,681] [INFO] [HttpMonitor]: Check
monitor_1 | GET https://httpbin.org/get
monitor_1 | response code: 200
monitor_1 | content length: 310
monitor_1 | request took: 0.126 seconds
The functional part is done. Daemon monitors `http://example.com <http://example.com>`_ and
`https://httpbin.org <https://httpbin.org>`_.
In the next section we will add some tests.
Tests Tests
----- -----
Create ``tests.py`` module in the ``monitoringdaemon`` package: It would be nice to add some tests. Let's do it.
We will use `pytest <https://docs.pytest.org/en/stable/>`_ and
`coverage <https://coverage.readthedocs.io/>`_.
Create ``tests.py`` in the ``monitoringdaemon`` package:
.. code-block:: bash .. code-block:: bash
:emphasize-lines: 9 :emphasize-lines: 9
@ -793,6 +889,7 @@ Create ``tests.py`` module in the ``monitoringdaemon`` package:
and put next into it: and put next into it:
.. code-block:: python .. code-block:: python
:emphasize-lines: 54,70-71
"""Tests module.""" """Tests module."""
@ -904,6 +1001,16 @@ You should see:
---------------------------------------------------- ----------------------------------------------------
TOTAL 129 18 86% TOTAL 129 18 86%
.. note::
Take a look at the highlights in the ``tests.py``.
In the ``test_example_monitor`` it emphasizes the overriding of the ``HttpClient``. The real
HTTP calls are mocked.
In the ``test_dispatcher`` we override both monitors with the mocks.
Conclusion Conclusion
---------- ----------

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB