Ingestion Satellites
Use Ingestion Satellites to integrate with on-premise tools and set up Custom integrations.
In addition to Ingestion Satellites and other integrations, you can import CSV files and display the data in Table reports.
Configure the integration
In your Harness project, go to the SEI module, select Account, and then select SEI Integrations under Data Settings.
Select Available Integrations and install the relevant integration.
- For tools with a dedicated SEI integration, install that integration. Note that GitHub, GitLab, and Bitbucket have both Cloud and Enterprise options. The Enterprise option is for on-prem.
- For tools without a dedicated integration, use the Custom integration. Support may be limited.
Configure the integration.
- Application-specific integrations
- Custom integrations
For application-specific integrations, select Satellite Integration or Use Satellite when installing the integration. For details about a specific integration, refer to the integration's documentation. You can find a list of application-specific integrations on the SEI integrations overview.
Credentials specified in the integration configuration are used to generate the Satellite configuration file, satellite.yml
.
- For on-prem Jira, you must use username and password credentials.
- For on-prem GitLab, you must use API key (personal access token) authentication.
After configuring the integration, download the Satellite configuration file, satellite.yml
.
For the Custom integration, enter a Name, and then select Install. The Satellite configuration file, satellite.yml
, is automatically downloaded.
Option: Use a proxy
The satellite can send its traffic to a proxy, with or without authentication.
Add the following proxy
settings to the levelops
section of the satellite.yml
config file:
levelops:
...
proxy:
host: YOUR_PROXY_IP_OR_DOMAIN ## Don't include schemes in `host` (such as https://), just domains.
port: YOUR_PROXY_PORT
To use authentication, include the username
and password
:
levelops:
...
proxy:
host: YOUR_PROXY_IP_OR_DOMAIN
port: YOUR_PROXY_PORT
username: YOUR_USERNAME
password: YOUR_PASSWORD
By default, only traffic to SEI is sent to the proxy. This means that connections to your internal integrations don't use the proxy. If you want to proxy all traffic, include all_traffic: true
.
levelops:
...
proxy:
host: YOUR_PROXY_IP_OR_DOMAIN
port: YOUR_PROXY_PORT
all_traffic: true
If the proxy uses https
, then the connection only works with a valid SSL certificate. If you're using a self-signed certificate, you must supply the certificate to the satellite.
- The recommended memory for one container is 4GB to 6GB.
- You can deploy multiple containers for the same integration using the same configuration file.
Run the Satellite container
- Docker
- Kubernetes
Download and install Docker Desktop.
On Linux, add your user to the Docker group so that you can run Docker commands without root
or sudo
.
sudo usermod -aG docker $(whoami)
You need to log out and log back in for the change to take effect.
Pull the latest version of the Ingestion Satellite container.
docker pull levelops/ingestion-satellite
If you aren't able to execute the
docker pull
command, you can manually download the Ingestion Satellite image from Docker Hub and install it.Run the Satellite container in the foreground.
docker run \
-v /absolute/path/to/satellite.yml:/levelops/config.yml \
levelops/ingestion-satellite
Option: Encrypt satellite.yml
Do avoid storing data at rest in the clear, you can encrypt satellite.yml
. The Satellite can read AES-256 encrypted config files. You must provide an environment variable with the encryption password.
Use the following command to encrypt the configuration file. Edit the input path (
/absolute/path/to/input/satellite.yml
) and output path (/path/to/output/satellite.yml.enc
) according to your environment.docker run -i --rm -v /absolute/path/to/input/satellite.yml:/levelops/input \
--entrypoint /bin/bash levelops/ingestion-satellite \
-c 'java -cp /levelops/satellite-agent.jar -Dloader.main=io.levelops.ingestion.agent.Encrypt org.springframework.boot.loader.PropertiesLauncher input' \
> /path/to/output/satellite.yml.encThere is no prompt, but you must enter your password in the terminal, and then press enter. When entering your password, it appears in plain text, but it isn't stored.
Run the
docker run
command with an encryption password environment variable.export ENCRYPTION_PASSWORD="<YOUR PASSWORD>"; docker run -d --restart unless-stopped \
-v /absolute/path/to/satellite.yml.enc:/levelops/config.yml \
--env ENCRYPTION_PASSWORD \
levelops/ingestion-satellite
If you need to make changes later on, you can use the following command to decrypt the configuration file. As before you must edit the input path and output path according to your environment. You'll also need to enter your password and press enter.
docker run -i --rm -v /absolute/path/to/input/satellite.yml.enc:/levelops/input \
--entrypoint /bin/bash levelops/ingestion-satellite \
-c 'java -cp /levelops/satellite-agent.jar -Dloader.main=io.levelops.ingestion.agent.Decrypt org.springframework.boot.loader.PropertiesLauncher input' \
> /path/to/output/satellite.yml
Troubleshooting: Satellite can't find satellite.yml
Errors mentioning ${levelops.api_key}
indicate that the Satellite can't find the config file. This can happen with older versions of Docker that can experience issues when mounting single files. To resolve this issue:
Rename
satellite.yml
toconfig.yml
, and then move the file into an empty folder.On Linux, check that your user (not
root
) owns both the folder and file, and that permissions are not too restrictive (as withchmod 755
).Run the
docker run
command with the parent folder instead of the specific config file.docker run \
-v /absolute/path/to/parent/folder:/levelops/config \
-e CONFIG_FILE=/levelops/config/config.yml \
levelops/ingestion-satellite
If everything is working, run the container in the background by adding
-d --restart unless-stopped
.docker run -d --restart unless-stopped \
-v /absolute/path/to/satellite.yml:/levelops/config.yml \
levelops/ingestion-satelliteOptionally, add
--name levelops
to give the container a name. Use a unique name per container if you are running more than one.
These commands are helpful for managing background containers.
# list containers
docker container ls
# stop or restart container with ID
docker container stop <ID>
docker container restart <ID>
# delete container by ID
docker rm <ID>
- Use the following template to prepare the Kubernetes deployment.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: levelops-satellite
subjects:
- kind: ServiceAccount
name: levelops-satellite
namespace: default
apiGroup: ""
roleRef:
kind: ClusterRole
name: edit
apiGroup: rbac.authorization.k8s.io
apiVersion: v1
kind: ServiceAccount
metadata:
name: levelops-satellite
namespace: default ## It is recommended to change this.
labels:
app: levelops
apiVersion: apps/v1
kind: Deployment
metadata:
name: levelops-satellite
namespace: default ## It is recommended to change this.
spec:
selector:
matchLabels:
app: levelops-satellite
template:
metadata:
labels:
app: levelops-satellite
spec:
serviceAccountName: levelops-satellite
containers:
- name: levelops-satellite
image: levelops/ingestion-satellite
imagePullPolicy: Always
resources:
limits:
memory: "5Gi"
cpu: "1000m"
volumeMounts:
- name: config-volume
mountPath: /levelops/config.yml
subPath: config.yml
volumes:
- name: config-volume
configMap:name: levelops-satellite-config
apiVersion: v1
kind: ConfigMap
metadata:
name: levelops-satellite-config
namespace: default ## It is recommended to change this.
data: ## This section comes from satellite.yml. If you copy and paste this section, you must fix the indentation.
config.yml: |
levelops:
tenant: <TENANT>
api_key: <API_KEY>
integrations:
- id: '<ID>'
application: custom
Apply the deployment to your cluster.
kubectl apply --namespace=your-name-space -f deployment.yml
Make sure the satellite is running correctly. You should see heartbeats being sent.
kubectl get pods --namespace=your-name-space ## Use this to find the pod.
kubectl logs <satellite pod> -f --namespace=your-name-spaceBecause the template configured the deployment with
imagePullPolicy: Always
, you get the latest updates when the pod is restarted.kubectl rollout restart deployment levelops-satellite
Update the Satellite
Use these commands if you need to update the Ingestion Satellite version.
- Docker
- Kubernetes
# Pull latest version
docker pull levelops/ingestion-satellite
# List containers and find the current satellite ID
docker container ls
# Stop and remove the old container. Replace <ID> accordingly.
docker container stop <ID>
docker rm <ID>>
# Run the container again. It uses the latest version. Replace the local path accordingly.
docker run -v /local/path/to/satellite.yml:/levelops/config.yml -d levelops/ingestion-satellite
If you aren't able to execute the docker pull
command, you can manually download the Ingestion Satellite image from Docker Hub and install it.
# Find the name of the satellite deployment.
kubectl get deployments
# Restart the satellite deployment.
kubectl rollout restart deployment <deployment-name>
If you didn't change the default values in the template, the deployment-name
is levelops-satellite
, and you can use the following restart
command:
kubectl rollout restart deployment levelops-satellite