Embedded Mode
This mode is recommended when you need to interact with the application runtime context. This mode integrates more seamless without additional configuration if you need to perform administrative tasks that requires the context of a running application. Below there's a few examples
- Executing ad-hoc tasks (rake tasks, django-admin, elixir mix tasks)
- Interactive console access
- Access REPL language environments (rails console, elixir, clojure, etc)
To use this mode, the agent need to have the context of the application, so it must be initialized along with any process that keeps running. The following environment variables are also required:
- HOOP_CONNECTIONdefines how resources are going to be published in the webapp dashboard.
- HOOP_DSNis a client key that authenticates with the gateway. See more information about client keys
Docker
To make every application starts with the agent
FROM python:3.9-slim
RUN mkdir /app
WORKDIR /app
RUN apt-get update -y && \
    apt-get install curl -y && \
    curl -s -L https://releases.hoop.dev/release/install-cli.sh | sh
RUN pip install --upgrade pip
COPY requirements.txt /app
RUN pip install -r requirements.txt
COPY . /app/
EXPOSE 8000
ENTRYPOINT ["hoopstart", "--"]
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Virtual Machines
When using bare VM's you'll need a Linux process manager like systemd
curl -s -L https://releases.hoop.dev/release/install-cli.sh | sh
cat - >/etc/systemd/system/hoopagent.service <<EOF
[Unit]
Description=Hoop Agent
After=network.target
[Service]
ExecStart=hoop start agent
Environment="HOME=/root"
Environment="HOOP_DSN=<CLIENT-KEY>"
Environment="HOOP_CONNECTION=vmapp"
StandardOutput=true
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable hoopagent.service
systemctl start hoopagent
If you need the context of the application like (environment variables exposed) you can use the hoopstart script.
cat - >/etc/systemd/system/hoopagent.service <<EOF
[Unit]
Description=MyApp
After=network.target
[Service]
ExecStart=hoopstart -- myapp.sh
Environment="HOME=/root"
Environment="HOOP_DSN=<CLIENT-KEY>"
Environment="HOOP_CONNECTION=vmapp"
StandardOutput=true
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF
Kubernetes Sidecar
Using the sidecar pattern you can run a container that has the context of your main application process.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp
        name: myapp
        ports:
        - containerPort: 8000
          name: http
          protocol: TCP
      - name: hoopagent
        image: hoophq/hoopdev
        name: hoopagent
        env:
        - name: HOOP_DSN
          value: 'client-key-val'
        - name: HOOP_CONNECTION
          value: 'myapp'
The deployment above configures two containers, the myapp and hoopagent. Using this pattern you can separate process and share the underline context of the main application (storage, network, environment variables).
AWS ECS
You could achieve the same pattern on Kubernetes on ECS, see the container dependency task definition example.
Heroku
On heroku use a Procfile to specify a separated process to run the agent with the context of your application. To install the agent use our buildpack. See this article for more information.
Modify a Procfile and just include the hoopstart script:
# Procfile ruby example
web: hoopstart -- bundle exec puma -C config/puma.rb