2023-01-25 09:08:23 +03:00
# Configuration Sources
2024-10-03 01:51:04 +03:00
> [!IMPORTANT]
> See [Security Considerations](../security-considerations.md#storing-configuration-secrets) for important information regarding specifying secrets in configuration.
2023-12-19 02:06:06 +03:00
`dotnet monitor` can read and combine configuration from multiple sources. The configuration sources are listed below in the order in which they are read (first is lowest precedence, last is highest precedence):
2023-01-25 09:08:23 +03:00
- Command line parameters
2023-12-19 02:06:06 +03:00
- Environment variables without `DOTNETMONITOR_` prefix e.g. `ASPNETCORE_Urls`
2023-01-25 09:08:23 +03:00
- User settings path
- On Windows, `%USERPROFILE%\.dotnet-monitor\settings.json`
- On \*nix, `$XDG_CONFIG_HOME/dotnet-monitor/settings.json`
2023-12-19 02:06:06 +03:00
- If `$XDG_CONFIG_HOME` isn't defined, we fall back to ` $HOME/.config/dotnet-monitor/settings.json`
- Shared settings path
- On Windows, `%ProgramData%\dotnet-monitor\settings.json`
- On \*nix, `/etc/dotnet-monitor/settings.json`
2023-01-25 09:08:23 +03:00
- [Key-per-file ](https://docs.microsoft.com/aspnet/core/fundamentals/configuration/#key-per-file-configuration-provider ) in the shared settings path
- On Windows, `%ProgramData%\dotnet-monitor`
- On \*nix, `/etc/dotnet-monitor`
2023-12-19 02:06:06 +03:00
- Environment variables with `DOTNETMONITOR_` prefix e.g. `DOTNETMONITOR_Urls`
- Full path to a JSON settings file via the `--configuration-file-path` command line option. First available in .NET Monitor 6.3
2023-01-25 09:08:23 +03:00
## Translating configuration between providers
2023-12-19 02:06:06 +03:00
While the rest of this document will showcase configuration examples in a JSON format, the same configuration can be expressed via any of the other configuration sources. For example, the API Key configuration can be expressed via shown below:
2023-01-25 09:08:23 +03:00
```json
{
"Authentication": {
"MonitorApiKey": {
"Subject": "ae5473b6-8dad-498d-b915-ffffffffffff",
"PublicKey": "eyffffffffffffFsRGF0YSI6e30sIkNydiI6IlAtMzg0IiwiS2V5T3BzIjpbXSwiS3R5IjoiRUMiLCJYIjoiTnhIRnhVZ19QM1dhVUZWVzk0U3dUY3FzVk5zNlFLYjZxc3AzNzVTRmJfQ3QyZHdpN0RWRl8tUTVheERtYlJuWSIsIlg1YyI6W10sIlkiOiJmMXBDdmNoUkVpTWEtc1h6SlZQaS02YmViMHdrZmxfdUZBN0Vka2dwcjF5N251Wmk2cy1NcHl5RzhKdVFSNWZOIiwiS2V5U2l6ZSI6Mzg0LCJIYXNQcml2YXRlS2V5IjpmYWxzZSwiQ3J5cHRvUHJvdmlkZXJGYWN0b3J5Ijp7IkNyeXB0b1Byb3ZpZGVyQ2FjaGUiOnt9LCJDYWNoZVNpZ25hdHVyZVByb3ZpZGVycyI6dHJ1ZSwiU2lnbmF0dXJlUHJvdmlkZXJPYmplY3RQb29sQ2FjaGffffffffffff19"
}
}
}
```
The same configuration can be expressed via environment variables using the using `__` (double underscore) as the hierarchical separator:
```bash
export Authentication__MonitorApiKey__Subject="ae5473b6-8dad-498d-b915-ffffffffffff"
export Authentication__MonitorApiKey__PublicKey="eyffffffffffffFsRGF0YSI6e30sIkNydiI6IlAtMzg0IiwiS2V5T3BzIjpbXSwiS3R5IjoiRUMiLCJYIjoiTnhIRnhVZ19QM1dhVUZWVzk0U3dUY3FzVk5zNlFLYjZxc3AzNzVTRmJfQ3QyZHdpN0RWRl8tUTVheERtYlJuWSIsIlg1YyI6W10sIlkiOiJmMXBDdmNoUkVpTWEtc1h6SlZQaS02YmViMHdrZmxfdUZBN0Vka2dwcjF5N251Wmk2cy1NcHl5RzhKdVFSNWZOIiwiS2V5U2l6ZSI6Mzg0LCJIYXNQcml2YXRlS2V5IjpmYWxzZSwiQ3J5cHRvUHJvdmlkZXJGYWN0b3J5Ijp7IkNyeXB0b1Byb3ZpZGVyQ2FjaGUiOnt9LCJDYWNoZVNpZ25hdHVyZVByb3ZpZGVycyI6dHJ1ZSwiU2lnbmF0dXJlUHJvdmlkZXJPYmplY3RQb29sQ2FjaGffffffffffff19"
```
Environment variables _can_ be prefixed with `DotnetMonitor_` (single underscore) to give them a higher precedence over environment variables without this prefix. In the following example:
```bash
export DotnetMonitor_DefaultProcess__Filters__0__Key="myapp"
export DefaultProcess__Filters__0__Key="dotnet"
```
The value from the variable `DotnetMonitor_DefaultProcess__Filters__0__Key` will be observed rather than the value from the variable `DefaultProcess__Filters__0__Key` , thus `dotnet monitor` will observe `DefaultProcess:Filters:0:Key` to be `myapp` .
### Kubernetes
When running in Kubernetes, you are able to specify the same configuration via Kubernetes secrets.
```bash
kubectl create secret generic apikey \
--from-literal=Authentication__MonitorApiKey__Subject=ae5473b6-8dad-498d-b915-ffffffffffff \
--from-literal=Authentication__MonitorApiKey__PublicKey=eyffffffffffffFsRGF0YSI6e30sIkNydiI6IlAtMzg0IiwiS2V5T3BzIjpbXSwiS3R5IjoiRUMiLCJYIjoiTnhIRnhVZ19QM1dhVUZWVzk0U3dUY3FzVk5zNlFLYjZxc3AzNzVTRmJfQ3QyZHdpN0RWRl8tUTVheERtYlJuWSIsIlg1YyI6W10sIlkiOiJmMXBDdmNoUkVpTWEtc1h6SlZQaS02YmViMHdrZmxfdUZBN0Vka2dwcjF5N251Wmk2cy1NcHl5RzhKdVFSNWZOIiwiS2V5U2l6ZSI6Mzg0LCJIYXNQcml2YXRlS2V5IjpmYWxzZSwiQ3J5cHRvUHJvdmlkZXJGYWN0b3J5Ijp7IkNyeXB0b1Byb3ZpZGVyQ2FjaGUiOnt9LCJDYWNoZVNpZ25hdHVyZVByb3ZpZGVycyI6dHJ1ZSwiU2lnbmF0dXJlUHJvdmlkZXJPYmplY3RQb29sQ2FjaGffffffffffff19 \
--dry-run=client -o yaml \
| kubectl apply -f -
```
You can then use a Kubernetes volume mount to supply the secret to the container at runtime.
2024-09-06 18:51:49 +03:00
```yaml
2023-01-25 09:08:23 +03:00
spec:
volumes:
- name: config
secret:
secretName: apikey
containers:
- name: dotnetmonitoragent
image: mcr.microsoft.com/dotnet/monitor:6
volumeMounts:
- name: config
mountPath: /etc/dotnet-monitor
```
Alternatively, you can also use configuration maps to specify configuration to the container at runtime.
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: my-configmap
data:
Metrics__MetricCount: "6"
```
You can then use a Kubernetes volume mount to supply the configuration map to the container at runtime
2024-09-06 18:51:49 +03:00
```yaml
2023-01-25 09:08:23 +03:00
spec:
volumes:
- name: config
configmap:
name: my-configmap
containers:
- name: dotnetmonitoragent
image: mcr.microsoft.com/dotnet/monitor:6
volumeMounts:
- name: config
mountPath: /etc/dotnet-monitor
```
If using multiple configuration maps, secrets, or some combination of both, you need to use a [projected volume ](https://kubernetes.io/docs/concepts/storage/volumes/#projected ) to map several volume sources into a single directory
2024-09-06 18:51:49 +03:00
```yaml
2023-01-25 09:08:23 +03:00
spec:
volumes:
- name: config
projected:
sources:
- secret:
name: apiKey
- configMap:
name: my-configmap
containers:
- name: dotnetmonitoragent
image: mcr.microsoft.com/dotnet/monitor:6
volumeMounts:
- name: config
mountPath: /etc/dotnet-monitor
```