Prometheus service discovery for OCI (Oracle Cloud Infrastructure).
Unfortunately, Prometheus team doesn't accept new service discovery integrations in the Prometheus code base. Instead, they propose to use file SD integration. Therefore, OCI Service Discovery works in following manner:
As should be obvious from the diagram, synchronization of monitored targets (i.e. OCI instances) happens via shared
oci-sd.json
file (the file name can be arbitrary):
- OCI-SD periodically provides this file
- Prometheus periodically consumes it.
Please note, that those discoveries/scrapings are independent of each other.
OCI-SD can be used in two ways: either as a standalone, CLI application, or as a Golang package which can be imported to your application.
You can build and run a command line application oci-sd
. Once properly configured (see the
Configuration section), the application starts to query OCI for list of instances
and write those to the oci-sd.json
file.
You can run the application with default values for configuration and output files:
./bin/oci-sd
Or you can provide specific values via command-line flags:
./bin/oci-sd -c conf/oci-sd.toml -o conf/prometheus-sd.json
See an Example section for a practical example and tutorial.
If you don't want to have a separate standalone application for service discovery, you can include the oci
(and probably the adapter
) package(s) into your application.
Here is an example usage:
ociConfig := oci.SDConfig{
// populate the config
}
logger := logrus.StandardLogger()
disc, err := oci.NewDiscovery(&ociConfig, logger)
if err != nil {
logger.WithFields(logrus.Fields{"func": "main", "err": err}).Fatal("can't create OCI discovery")
}
sdOutputFile := "oci-sd.json"
adapter = adapter.NewAdapter(ctx, sdOutputFile, "ociSD", disc, *logger)
adapter.Run()
Prerequisites for build of oci-sd
as a standalone application is go1.11
+ and make
:
make build
Command line flags
You can run oci-sd --help
to see command line configuration flags:
$ ./bin/oci-sd --help
Usage of ./bin/oci-sd:
-t, --compartment string compartment for discovering targets
-c, --config-file string external config file (default "oci-sd.toml")
-l, --log-directory string log file location (default "/var/log/oci-sd/")
-i, --instance-principal initialise with instance principal authentication
-o, --output-file string output file for file_sd compatible file (default "oci-sd.json")
-s, --sanitise sanitise instance tags to fit Prometheus requirements by removing special characters (:, -)
Configuration file
The configuration file (e.g. oci-sd.toml
) should contain following mandatory values:
[SDConfig]
User = "ocid1.user.1"
FingerPrint = "42:42:42"
KeyFile = "/home/user/.oci/oci_api_key.pem"
PassPhrase = "secret"
Tenancy = "ocid1.tenancy.1"
Region = "us-phoenix-1"
Compartment = "ocid1.compartment.1"
Additionally, there can be following optional values:
Port = 4242 # default port is 9100
RefreshInterval = "120s" # default interval is 60 seconds
Here is Prometheus configuration for the file based service discovery:
scrape_configs:
- job_name: "oci-sd"
scrape_interval: 5s
file_sd_configs:
- files:
- oci-sd.json
refresh_interval: 1m
relabel_configs:
- source_labels: ["__meta_oci_public_ip"]
target_label: "__address__"
replacement: "${1}:9100"
The following meta-labels are available on targets during re-labeling:
__meta_oci_availability_domain
: the availability domain in which the instance is running__meta_oci_compartment_id
: OCID of the used compartment__meta_oci_defined_tag_<namespace>_<tagkey>
: each defined tag value of the instance__meta_oci_freeform_tag_<tagkey>
: each freeform tag value of the instance__meta_oci_instance_id
: OCID of the instance__meta_oci_instance_name
: the name of the instance__meta_oci_instance_state
: the state of the instance__meta_oci_private_ip
: the private IP address of the instance__meta_oci_public_ip
: the public IP address of the instance, if available
The default log location is /var/log/oci-sd/oci-sd.log
. It can be changed by passing in a custom --log-directory variable.
You can find an example for standalone application in the example directory. It contains:
oci-sd
configuration file.- Terraform scripts which create 3 OCI instances with running node_exporters.
- Prometheus configuration file with pre-configured
file_sd
scrape config andoci-sd
specific re-labeling.
See example/README.md file for more details.
The oci-sd application and the oci package are published under BSD 3-Clause license.
The adapter package is published under Apache 2.0 license.