curl --request PUT \
--url http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/vnd.composer.v3+json' \
--data '
{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"timeFormat": {
"timeZone": "UTC",
"options": {
"hour12": true
}
}
}
'import requests
url = "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}"
payload = {
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": True,
"timeFormat": {
"timeZone": "UTC",
"options": { "hour12": True }
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/vnd.composer.v3+json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
Authorization: 'Basic <encoded-value>',
'Content-Type': 'application/vnd.composer.v3+json'
},
body: JSON.stringify({
expression: 'SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate',
name: 'sum_of_sales',
label: 'Sum of Sales',
visible: true,
timeFormat: {timeZone: 'UTC', options: {hour12: true}}
})
};
fetch('http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'expression' => 'SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate',
'name' => 'sum_of_sales',
'label' => 'Sum of Sales',
'visible' => true,
'timeFormat' => [
'timeZone' => 'UTC',
'options' => [
'hour12' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/vnd.composer.v3+json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}"
payload := strings.NewReader("{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/vnd.composer.v3+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/vnd.composer.v3+json")
.body("{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/vnd.composer.v3+json'
request.body = "{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"numberFormat": {
"type": "PLAIN",
"decimals": 2,
"separator": true,
"negative": "SIGNED",
"standardUnit": "NONE",
"storageUnit": "BYTES",
"currencyCode": "USD"
},
"timeFormat": {
"timeZone": "UTC",
"options": {
"second": "NUMERIC",
"minute": "NUMERIC",
"hour": "NUMERIC",
"day": "NUMERIC",
"weekday": "LONG",
"week": "TWO_DIGIT",
"month": "NUMERIC",
"quarter": "TWO_DIGIT",
"year": "NUMERIC",
"dayOfYear": "NUMERIC",
"hour12": true
}
},
"granularity": "MILLISECOND",
"dataType": "ATTRIBUTE"
}{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"numberFormat": {
"type": "PLAIN",
"decimals": 2,
"separator": true,
"negative": "SIGNED",
"standardUnit": "NONE",
"storageUnit": "BYTES",
"currencyCode": "USD"
},
"timeFormat": {
"timeZone": "UTC",
"options": {
"second": "NUMERIC",
"minute": "NUMERIC",
"hour": "NUMERIC",
"day": "NUMERIC",
"weekday": "LONG",
"week": "TWO_DIGIT",
"month": "NUMERIC",
"quarter": "TWO_DIGIT",
"year": "NUMERIC",
"dayOfYear": "NUMERIC",
"hour12": true
}
},
"granularity": "MILLISECOND",
"dataType": "ATTRIBUTE"
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}Updates existing custom metric or creates a new one if custom metric with {customMetricName} doesn't exist
Requires WRITE permission on the source or READ permission on the source and ROLE_EDIT_FORMULAS
curl --request PUT \
--url http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName} \
--header 'Authorization: Basic <encoded-value>' \
--header 'Content-Type: application/vnd.composer.v3+json' \
--data '
{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"timeFormat": {
"timeZone": "UTC",
"options": {
"hour12": true
}
}
}
'import requests
url = "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}"
payload = {
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": True,
"timeFormat": {
"timeZone": "UTC",
"options": { "hour12": True }
}
}
headers = {
"Authorization": "Basic <encoded-value>",
"Content-Type": "application/vnd.composer.v3+json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {
Authorization: 'Basic <encoded-value>',
'Content-Type': 'application/vnd.composer.v3+json'
},
body: JSON.stringify({
expression: 'SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate',
name: 'sum_of_sales',
label: 'Sum of Sales',
visible: true,
timeFormat: {timeZone: 'UTC', options: {hour12: true}}
})
};
fetch('http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_PORT => "8080",
CURLOPT_URL => "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'expression' => 'SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate',
'name' => 'sum_of_sales',
'label' => 'Sum of Sales',
'visible' => true,
'timeFormat' => [
'timeZone' => 'UTC',
'options' => [
'hour12' => true
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Basic <encoded-value>",
"Content-Type: application/vnd.composer.v3+json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}"
payload := strings.NewReader("{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Basic <encoded-value>")
req.Header.Add("Content-Type", "application/vnd.composer.v3+json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}")
.header("Authorization", "Basic <encoded-value>")
.header("Content-Type", "application/vnd.composer.v3+json")
.body("{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("http://10.2.4.166:8080/composer/api/sources/{sourceId}/custom-metrics/{customMetricName}")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Basic <encoded-value>'
request["Content-Type"] = 'application/vnd.composer.v3+json'
request.body = "{\n \"expression\": \"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate\",\n \"name\": \"sum_of_sales\",\n \"label\": \"Sum of Sales\",\n \"visible\": true,\n \"timeFormat\": {\n \"timeZone\": \"UTC\",\n \"options\": {\n \"hour12\": true\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"numberFormat": {
"type": "PLAIN",
"decimals": 2,
"separator": true,
"negative": "SIGNED",
"standardUnit": "NONE",
"storageUnit": "BYTES",
"currencyCode": "USD"
},
"timeFormat": {
"timeZone": "UTC",
"options": {
"second": "NUMERIC",
"minute": "NUMERIC",
"hour": "NUMERIC",
"day": "NUMERIC",
"weekday": "LONG",
"week": "TWO_DIGIT",
"month": "NUMERIC",
"quarter": "TWO_DIGIT",
"year": "NUMERIC",
"dayOfYear": "NUMERIC",
"hour12": true
}
},
"granularity": "MILLISECOND",
"dataType": "ATTRIBUTE"
}{
"expression": "SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate",
"name": "sum_of_sales",
"label": "Sum of Sales",
"visible": true,
"numberFormat": {
"type": "PLAIN",
"decimals": 2,
"separator": true,
"negative": "SIGNED",
"standardUnit": "NONE",
"storageUnit": "BYTES",
"currencyCode": "USD"
},
"timeFormat": {
"timeZone": "UTC",
"options": {
"second": "NUMERIC",
"minute": "NUMERIC",
"hour": "NUMERIC",
"day": "NUMERIC",
"weekday": "LONG",
"week": "TWO_DIGIT",
"month": "NUMERIC",
"quarter": "TWO_DIGIT",
"year": "NUMERIC",
"dayOfYear": "NUMERIC",
"hour12": true
}
},
"granularity": "MILLISECOND",
"dataType": "ATTRIBUTE"
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}{
"timestamp": "2023-11-07T05:31:56Z",
"status": 123,
"error": "<string>",
"message": "<string>",
"path": "<string>"
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}{
"error": "<string>",
"details": "<string>",
"message": "<string>",
"path": "<string>",
"status": "<string>",
"code": "<string>",
"errorCode": "<string>",
"timestamp": "<string>",
"problems": [
{
"name": "<string>",
"message": "<string>",
"level": "ERROR",
"dependencies": {}
}
]
}Authorizations
HTTP Basic authentication using global administrator credentials (username and password).
Body
Custom metric representation
Expression that defines the custom metric
"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate"
Unique identifier of the custom metric within the source across all custom metrics and fields. It's immutable and may be specified in create request only
255"sum_of_sales"
User visible representation of the custom metric.
255"Sum of Sales"
Whether the custom metric should be visible to users on a visual
Number format of the custom metric value display
Show child attributes
Show child attributes
Time format of the custom metric value display
Show child attributes
Show child attributes
The minimum time granularity of this field.
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR Data type of the custom metric. It’s detected automatically based on the metric expression
ATTRIBUTE, NUMBER, INTEGER, TIME, TEXT, HIERARCHY, NULL Response
The custom metric was updated
Custom metric representation
Expression that defines the custom metric
"SUM(sales_in_usd) + SUM(sales_in_uah) * uah_to_usd_exchange_rate"
Unique identifier of the custom metric within the source across all custom metrics and fields. It's immutable and may be specified in create request only
255"sum_of_sales"
User visible representation of the custom metric.
255"Sum of Sales"
Whether the custom metric should be visible to users on a visual
Number format of the custom metric value display
Show child attributes
Show child attributes
Time format of the custom metric value display
Show child attributes
Show child attributes
The minimum time granularity of this field.
MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR Data type of the custom metric. It’s detected automatically based on the metric expression
ATTRIBUTE, NUMBER, INTEGER, TIME, TEXT, HIERARCHY, NULL Was this page helpful?