issrae
issrae

Reputation: 53

how to add the plugin fluent-plugin-opensearch to docker

I'm trying to send logs from fluentd (installed using docker) to opensearch.

In configuration file, there's @type opensearch that uses the plugin fluent-plugin-opensearch which I installed locally as a Ruby gem.

I get the following error:

2022-04-22 15:47:10 +0000 [error]: config error file="/fluentd/etc/fluentd.conf" error_class=Fluent::NotFoundPluginError error="Unknown output plugin 'opensearch'. Run 'gem search -rd fluent-plugin' to find plugins"

As a solution, I found out that I need to add the plugin to the fluentd docker container, but I couldn't find a way to do that.

Any way to add the plugin to docker or an alternative to this solution would be appreciated.

Upvotes: 4

Views: 5977

Answers (1)

Daniel
Daniel

Reputation: 1660

The comments already gave a hint, you will need to build your own Docker image. Depending on the infrastructure you have available, you can either build the image, store it in some registry and then use it in your compose file, or build it on the machine that you use docker on.

The Dockerfile

Common to both approaches is that you'll need a Dockerfile. I am using Calyptias Docker image as a base, but you can use whatever fluentd image you like to. My docker file looks as follows:

FROM ghcr.io/calyptia/fluentd:v1.14.6-debian-1.0

USER root

RUN gem install fluent-plugin-opensearch
RUN fluent-gem install fluent-plugin-rewrite-tag-filter fluent-plugin-multi-format-parser

USER fluent
ENTRYPOINT ["tini",  "--", "/bin/entrypoint.sh"]
CMD ["fluentd"]

As you can see it installs a few more plugins, but the first RUN line is the important one for you.

Option 1

If you have a container registry available, you can build the image and push it there, either using a CI/CD pipeline or simply locally. Then you can reference this custom image instead of whatever other fluentd image you're using today as such:

fluentd:
    image: registry.your-domain.xyz/public-projects/fluentd-opensearch:<tag|latest>
    container_name: fluentd
    ports:
      - ...
    restart: unless-stopped
    volumes:
      - ...

Adjust the config to your needs.

Option 2

You can also have docker-compose build the container locally for you. For this, create a directory fluentd in the same folder where you store your docker-compose.yml and place the Dockerfile there.

fluentd:
        build: ./fluentd
        container_name: fluentd
        ports:
          - ...
        restart: unless-stopped
        volumes:
          - ...

Instead of referencing the image from some registry, you can reference a local build directory. This should get you started.

Upvotes: 6

Related Questions