Migrating EF1 Extensions ######################## | Use this guide to understand how to migrate an existing Python EF1 extension to the new EF2 format. Requirements ============ * `Python 3.10 `_ * ``dt-extensions-sdk`` installed and in your ``PATH`` (you can run with ``dt-sdk --help``). * `VSCode `_ with the `Dynatrace Extensions `_ extension installed. Step by Step ============ To migrate an existing python EF1 extension using VSCode, the steps are as follows: 1. Create a new EF2 extension 2. Import the EF1 extension using the ``Dynatrace extensions: Convert Python`` command 3. Convert the code, moving the class from the original extension to the ``__main__.py`` file of the new extension Create a new EF2 extension """""""""""""""""""""""""" 1. Open an empty folder in VSCode, then run the ``Dynatrace extensions: Initialize Workspace`` command 2. Select the schema version (latest recommended), and the certificates you want to use to sign the extension | .. image:: ../_static/img/migrate-01-new-extension.png :alt: Init workspace | 3. Chose the ``Python Extension 2.0`` project type 4. Give your extension a name, it must respect the python module naming convention (all lower case with optional underscores). | .. image:: ../_static/img/migrate-02-type.png :alt: Chose project type | Import the Python EF1 extension """"""""""""""""""""""""""""""" | The first step is to convert the old ``plugin.json`` file to the new ``activationSchema.json`` format. | This will automatically create the **Settings 2.0 UI** for your extension, which defines the UI for the user to configure the extension. | | Run the command ``Dynatrace extensions: Convert Python``. | You can chose to import an existing python extension from: | * The extension zip file * The plugin.json file * From your Dynatrace environment | .. image:: ../_static/img/migrate-03-import.png :alt: Import extension | | In this example we are importing from a Dynatrace environment, which gives you a list of all python extensions on that environment. | | If you would like to import from your computer, a file picker will open, and you can select the zip or plugin.json file of your extension. | .. image:: ../_static/img/migrate-04-import-remote.png :alt: Import from dynatrace | | After you select an extension, your ``activationSchema.json`` will be overwritten with the correct settings. | | You should also review that file, to make sure your UI looks the way you want it to. | .. note:: | If you are importing a local (OneAgent) extension, delete the entry **activation > remote** from the extension.yaml file. | If instead you are importing a remote (Activegate) extension, delete **activation > local**. | You can also make your extension work both remotely and locally, by keeping both entries and modifying the **activationSchema.json** file accordingly. Modify the extension code """"""""""""""""""""""""" .. note:: | We are working on automating part of this step. | Move your existing extension code to the ``__main__.py`` file of the new extension. | The easiest way to accomplish this is by pasting the code from your existing extension class into the new ``ExtensionImpl`` class. | | Here are the most important changes you need to make to your code: | .. list-table:: Code conversion reference :widths: 40 10 10 40 :header-rows: 1 * - Description - EF1 method - EF2 method - Notes * - Logging - ``self.logger.info("message")`` - ``self.logger.info("message")`` - Stays the same * - Obtaining user defined parameters - ``self.config.get("param_name", "default_value")`` - ``self.activation_config.get("param_name", "default_value")`` - You can find and replace all ``self.config.`` entries with ``self.activation_config.`` * - Report an event - ``self.results_builder.report_custom_info_event`` - ``self.report_dt_event`` - Try to keep topology (groups, device, IDs) out of the code, this is defined later in the ``extension.yaml`` file. * - Report a metric - ``device.absolute("metric_key", metric_value, {"dimension_name": "dimension_value"})`` - ``self.report_metric("metric_key", metric_value, {"dimension_name": "dimension_value"})`` - There is no concept of a ``device`` in the python code anymore, send metrics directly. * - Create groups and custom devices - ``self.topology_builder.create_group``, ``group.create_device`` - ``n/a`` - Doesn't exist, topology is defined in the ``extension.yaml`` file. Build and upload the extension """""""""""""""""""""""""""""" | Build the extension by running the command ``Dynatrace extensions: Build``. | If the build is successful, you will see a prompt to upload the extension to your Dynatrace environment and activate it. | Accept both prompts | | Navigate to your Dynatrace environment, to ``Infrastructure Observability > Extensions`` and find your extension. | .. image:: ../_static/img/migrate-05-activation.png :alt: Extension config | | Click ``Add monitoring configuration`` | Check that your UI looks the way you want it to, and fill in the parameters. .. note:: | You can copy the ``value`` from the right side JSON Snippet and use it in your ``activation.json`` file to test your extension locall with ``dt-sdk run`` | .. image:: ../_static/img/migrate-06-activation-config.png :alt: Extension config | Limitations """"""""""" * The ``process snapshot`` is not yet supported, but will be added in the future. As a workaround the file ``/dynatrace/oneagent/plugin/oneagent_latest_snapshot.log`` can be read and parsed as JSON. * The metric metadata and topology must be added to the ``extension.yaml`` file, part of this will be automated in the future.