μλ
νμΈμ,
μΉ μΈν°νμ΄μ€ 'μμ€ μΆκ°' μ΅μ
μ μ¬μ©νλ λμ 'λͺ
λ Ήμ€ λλ κ΅¬μ± νμΌμμ' λ°μ΄ν° μμ€λ₯Ό μΆκ°ν μ μλμ§ κΆκΈν©λλ€...
influxdb μ€μΉ + grafana μ€μΉλ₯Ό μλννκ³ grafana λ΄λΆμ 'localhost' influxdb λ°μ΄ν° μμ€λ₯Ό μλμΌλ‘ μμ±νλ μ€μΉ νλ‘μΈμ€λ₯Ό λ§λ€κ³ μΆμ΅λλ€. μ΄κ²μ΄ κ°λ₯ν©λκΉ?
κ°μ¬ ν΄μ
μΉ APIλ₯Ό ν΅ν΄ λ€μκ³Ό κ°μ΅λλ€.
curl ' http://localhost :3000/api/datasources' -X PUT --data-binary '{"μ΄λ¦":"ν μ€νΈ","μ ν":"influxdb_08","url":" http://localhost :8086","μ‘μΈμ€":"νλ‘μ","isDefault":true,"λ°μ΄ν°λ² μ΄μ€":"asd","μ¬μ©μ":"asd","λΉλ°λ²νΈ":"asd"}'
λ¬Έμ λ μμ μμ μ μννλ €λ©΄ API ν€κ° νμνκ³ API ν€λ₯Ό μμ±νλ €λ©΄ UIκ° νμνλ€λ κ²μ λλ€. μ루μ μ μ¬μ©μ μ΄λ¦/λΉλ°λ²νΈ(μ: κ΄λ¦¬μ μ¬μ©μμ μ¬μ©μ μ΄λ¦/λΉλ°λ²νΈ)μ ν¨κ» APIλ₯Ό μ¬μ©ν μ μλλ‘ νλ κ²μ λλ€.
κ³ λ§μ, λλ μ΄κ²μ μλνκ³ λ³Ό κ²μ΄λ€ :-)
μ£Όμ λ¬Έμ λ μΉ APIμ λν λ¬Έμλ₯Ό μ°Ύμ μ μλ€λ κ²μ
λλ€... μλ§λ μ κ° λκ°λ₯Ό λμΉκ³ μλ κ² κ°μ΅λλ€.
λ€μμ http μμ²μ λ³΄κ³ νμλ λͺ κ°μ§ νμ΄μ¬ μ½λμ λλ€.
import requests
[ provide credential variables etc ]
grafana_url = os.path.join('http://', '%s:%u' % (grafana_host, grafana_port))
session = requests.Session()
login_post = session.post(
os.path.join(grafana_url, 'login'),
data=json.dumps({
'user': grafana_user,
'email': '',
'password': grafana_password }),
headers={'content-type': 'application/json'})
# Get list of datasources
datasources_get = session.get(os.path.join(grafana_url, 'api', 'datasources'))
datasources = datasources_get.json()
# Add new datasource
datasources_put = session.put(
os.path.join(grafana_url, 'api', 'datasources'),
data=json.dumps({
'access': 'direct',
'database': ifdb_database,
'name': datasource_name,
'password': ifdb_password,
'type': 'influxdb_08',
'url': 'http://%s:%u' % (ifdb_host, ifdb_port),
'user': ifdb_user}),
headers={'content-type': 'application/json'})
κ°μ¬ ν΄μ,
μ€μΉμ μΌλΆκ° λ κ²μ΄κΈ° λλ¬Έμ 'Curl' λ°©μμ΄ μ½μ λ§λ€ κ²μ΄λΌκ³ μκ°ν©λλ€. κ·Έλ¬λ νμ΄μ¬λ μ μ©ν μ μμΌλ―λ‘ μλν΄ λ³Ό κ²μ
λλ€. λ€μνλ² κ°μ¬λ립λλ€:-)
μ μ
2.1μμ μ΄κ²μ λ μ½κ² λ§λ€κ³ Web apiμ λ μ½κ² μνΈ μμ©ν μ μλ CLI λꡬλ λ§λ€λ €κ³ λ Έλ ₯ν κ²μ λλ€.
μλ
λ ν μΌλ
"λ¬Έμ λ μμ μμ
μ μννλ €λ©΄ API ν€κ° νμνκ³ API ν€λ₯Ό μμ±νλ €λ©΄ UIκ° νμνλ€λ κ²μ
λλ€."
κ·Έλ° curl λͺ
λ Ήμ 보λ΄λ €κ³ νλ©΄ ν¨κ³Όμ μΌλ‘ {"message":"Access denied"}κ° νμλ©λλ€.
"μ루μ
μ μ¬μ©μ μ΄λ¦/λΉλ°λ²νΈ(μ: κ΄λ¦¬μ μ¬μ©μμ μ¬μ©μ μ΄λ¦/λΉλ°λ²νΈ)μ ν¨κ» APIλ₯Ό μ¬μ©ν μ μκ² νλ κ²"μ΄ ββμλ―Ένλ λ°λ₯Ό μ€λͺ
ν΄ μ£Όμκ² μ΅λκΉ?
κ°μ¬ ν΄μ...
μλ
νμΈμ μ¬λ¬λΆ,
PRI-mcallenμ Python μ루μ
μ μ μκ² μ λ§μμ΅λλ€ :-) μ λ κ·Έ κΈΈμ κ° κ²μ
λλ€.
λλ μ£Όμ λ₯Ό λ«μ΅λλ€.
κ°μ¬ ν΄μ!!
@PRI-mcallen λ΄ νκ²½μ νμ΄μ¬ μΈν°ν리ν°κ° μκΈ° λλ¬Έμ λ€μμ κΈ°λ°μΌλ‘ νλ νμ΄μ¬ μ€ν¬λ¦½νΈμ κ°μ¬λ립λλ€ curl
μ΄κ²μ μ€νν΄μΌ νλ©° λ€λ₯Έ μ¬λμκ² μ μ©ν μ μμ΅λλ€.
μ΄κ²μ λ컀μμ grafanaλ₯Ό μ€ννλ λ° μμ΄ μ λ§ λ²κ±°λ‘μ΄ μΌμ λλ€. λ컀 μ€μΌμ€νΈλ μ΄μ λꡬ(maestro-ng)λ₯Ό μ¬μ©ν©λλ€. grafanaμ© λ컀 μ΄λ―Έμ§κ° μμΌλ©° νμ° λ°μ΄ν° μμ€λ₯Ό μλμΌλ‘ ꡬμ±ν μ μκΈ°λ₯Ό μν©λλ€. μ€μΌμ€νΈλ μ΄μ λꡬλ νμ° μ»¨ν μ΄λλ₯Ό μμ±ν λ€μ μ΄μ μμ‘΄νλ κ·ΈλΌνλ 컨ν μ΄λλ₯Ό μμ±ν©λλ€. μ΄ λꡬλ νμ° μ»¨ν μ΄λμ μ£Όμλ₯Ό env λ³μλ‘ grafana 컨ν μ΄λμ μ£Όμ ν©λλ€. κ·Έλνμ΄νΈ λ°μ΄ν° μμ€λ₯Ό μλμΌλ‘ ꡬμ±νκΈ° μν΄ grafana 컨ν μ΄λμμ μ€νλλ μμ μ€ν¬λ¦½νΈκ° νμν©λλ€. μ°λ¦¬λ grafana 1.9μμ config.jsλ₯Ό μ¬μ©νμ¬ μ΄ μμ μ μνν μ μμμ§λ§ μ§κΈμ μ΄λ₯Ό μννλ HTTP API(λ¬Έμνλμ§ μμ)λ§ μμ΅λλ€.
@iangkent , HTTP API(νΈλμμ μ λ³΄κ³ μμ€κ³)λ₯Ό μ¬μ©νλ λ°©λ²μ λν μλ μμ κ²μν python μ€λν«μ μ°Έμ‘°νμΈμ.
μλ
@PRI-mcallenμ΄ 2.1.0-pre1μ κ²μν python μ€λν«μ ν μ€νΈνκ³ μλλ° λκ° κΉ¨μ§ κ² κ°μ΅λλ€(2.0.2 λ° 2.0.3-pre1μμ μλνκΈ° λλ¬Έμ)
λ°μ΄ν° μμ€λ₯Ό μΆκ°νμ¬ μ»μ μλ΅μ λ€μκ³Ό κ°μ΅λλ€.
datasources_put.json()
{u'message': u'μ°Ύμ μ μμ'}
κ·Έλ¦¬κ³ grafana λ‘κ·Έμμ :
2015/07/13 11:27:49 [I] μλ£ /api/datasources 404 Not Found in 1.169711ms
curlμ μ§μ μ¬μ©νμ¬ λμΌν λμ(μΏ ν€ μΈμ¦ λλ μ¬μ©μ/ν¨μ€ μ¬μ©)μ μλνμ΅λλ€.
컬 --μ¬μ©μ κ΄λ¦¬μ:κ΄λ¦¬μ \
-X λ£κΈ° \
-H 'μ½ν
μΈ μ ν: application/json;charset=UTF-8' \
--data-binary "{\"μ΄λ¦\":\"test4\",\"isDefault\":\"true\",\"μ ν\":\"influxdb_08\",\"url\":\ " http://localhost :8086\",\"μ‘μΈμ€\":\"νλ‘μ\",\"λ°μ΄ν°λ² μ΄μ€\":\"ν
μ€νΈ4\",\"μ¬μ©μ\":\"ν
μ€νΈ4\",\"λΉλ°λ²νΈ \":\"ν
μ€νΈ4\"}" \
" http://172.16.149.149 :3000/api/datasources ".
{"λ©μμ§λ₯Ό μ°Ύμ μ μμ΅λλ€"}
λꡬλ μ§ λ¬Έμ λ₯Ό ν΄κ²°νκ±°λ μμ νλ λ°©λ²μ λν μμ΄λμ΄κ° μμ΅λκΉ?
미리 κ°μ¬λ립λλ€
μνλ
@ 3fr61n 2.1μ HTTP APIμ μμ μ£Όμ λ³κ²½ μ¬νμ΄ μμ΅λλ€(λ³κ²½ λ‘κ·Έμ μμ).
λ°μ΄ν° μμ€ HTTP API μ£Όμ λ³κ²½, ADD λ°μ΄ν° μμ€λ μ΄μ POST /api/datasources/, μ λ°μ΄νΈλ μ΄μ PUT /api/datasources/:idμ λλ€.
κ°μ¬ ν΄μ!!! μ§κΈ μλν©λλ€
grafana 2.1μμλ μ΄μ κΈ°λ³Έ μΈμ¦μ μ¬μ©νμ¬ APIμ λν΄ μΈμ¦ν μ μμΌλ―λ‘ λ‘κ·ΈμΈνκ³ μΏ ν€λ₯Ό μ¬μ©νμ¬ API ν€λ₯Ό μμ±νκ±°λ λ°μ΄ν° μμ€λ₯Ό μΆκ°ν νμκ° μμ΅λλ€.
https://github.com/grafana/grafana/issues/2218#issuecomment -117041541
curl -i -XPOST ' http://admin:admin@hostname :3000/api/datasources' --data-binary '{\"μ΄λ¦\":\"influxdb_09x\",\"μ ν\":\"influxdb \",\"μ‘μΈμ€\":\"νλ‘μ\",\"url\":\" http://hostname :8086\",\"λΉλ°λ²νΈ\":\"루νΈ\",\"μ¬μ©μ\" :\"루νΈ\",\"λ°μ΄ν°λ² μ΄μ€\":\"cadvisor\",\"basicAuth\":true,\"basicAuthUser\":\"admin\",\"basicAuthPassword\":\"admin\" ,\"isDefault\":true,\"jsonData\":null}'
"[{"fieldNames":["Name"],"classification":"RequiredError","message":"Required"},{"fieldNames":["Type"],"classification":"μ΄ νμλ©λλ€. RequiredError","message":"νμ"},{"fieldNames":["μ‘μΈμ€"],"classification":"RequiredError","message":"νμ"}]"
ν€λ ContentType application/jsonμ΄ νμν©λλ€.
curl -i -XPOST ' http://admin:admin@hostname :3000/api/datasources' --header "ContentType μμ© νλ‘κ·Έλ¨/json" --data-binary '{\"μ΄λ¦\":\"influxdb2\", \"μ ν\":\"influxdb_09x\",\"μ‘μΈμ€\":\"νλ‘μ\",\"url\":\" http://νΈμ€νΈ μ΄λ¦ :8086\",\"λΉλ°λ²νΈ\":\" root\",\"user\":\"root\",\"database\":\"cadvisor\",\"basicAuth\":true,\"basicAuthUser\":\"admin\",\" basicAuthPassword\":\"admin\",\"isDefault\":true,\"jsonData\":null}'
μ¬μ ν μμ μ€λ₯λ₯Ό λ°νν©λλ€.
μ½λ‘ μ΄ λλ½λμμ΅λλ€. -H 'Content-Type: application/json;charset=UTF-8' \
곡μ λ컀 νμ°(hopsoft/graphite-statsd) λ° grafana(grafana/grafana) μ΄λ―Έμ§λ₯Ό μ¬μ©νκ³ μμΌλ©° λ€μ λͺ λ Ήμ΄ ν¨κ³Όμ μ΄μμ΅λλ€.
curl 'http://admin:[email protected]:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary '{"name":"localGraphite","type":"graphite","url":"http://192.168.99.100","access":"proxy","isDefault":true,"database":"asd"}'
grafana 2.6 λ° influxdb 0.10μμ λ€μ μ»¬μ΄ μ¬λ°λ₯΄κ² μλν©λλ€.
curl 'http://admin:[email protected]:3000/api/datasources' -X POST -H 'Content-Type: application/json;charset=UTF-8' --data-binary '{"name":"influx","type":"influxdb","url":"http://localhost:8086","access":"proxy","isDefault":true,"database":"mydb","user":"admin","password":"admin"}'
λ€μμ μ¬μ©νμ¬ λ°μ΄ν° μμ€ κ΅¬μ±μ νμΈν μ μμ΅λλ€.
curl 'http://admin:[email protected]:3000/api/datasources'
μ΄ λ¬Έμ λ 3μμ μ’ λ£λμμ§λ§ Dockerμμ μ¬μ©νκΈ° μν΄ λ κΉ¨λν λ°©μμΌλ‘ μ΄λ₯Ό μλνν μ μλ λ°©λ²μ΄ μμ΅λκΉ?
μ΄ λ¬Έμ λ 3μμ μ’ λ£λμμ§λ§ Dockerμμ μ¬μ©νκΈ° μν΄ λ κΉ¨λν λ°©μμΌλ‘ μ΄λ₯Ό μλνν μ μλ λ°©λ²μ΄ μμ΅λκΉ?
run2.sh
Dockerμμ μννλ μμ
( run.sh
μ grafana/grafana
run.sh
μ΄ μ΄λ―Έ μμ):
echo 'Starting Grafana...'
/run.sh "$@" &
AddDataSource() {
curl 'http://localhost:3000/api/datasources' \
-X POST \
-H 'Content-Type: application/json;charset=UTF-8' \
--data-binary \
'{"name":"Prometheus","type":"prometheus","url":"http://prometheus:9090","access":"proxy","isDefault":true}'
}
until AddDataSource; do
echo 'Configuring Grafana...'
sleep 1
done
echo 'Done!'
wait
κ·Έλ¬λ λλ μ΄κ²μ΄ λ§€μ° μ¬ν λμμΈμ΄λΌλ λ° λμν©λλ€. λ€λ₯Έ μμ© νλ‘κ·Έλ¨μ μμνκΈ° μ μ ꡬμ±ν μ μμ΅λλ€. Grafanaλ₯Ό λ¨Όμ μμν λ€μ ꡬμ±ν΄μΌ ν©λλ€. κΈ°μ΄ ν.
@torkeloλ , Grafana λꡬλ₯Ό μ μ¬μ©νμ
¨μ΅λλ€!
λ€μ λͺ
λ Ήμ μ¬μ©νμ¬ Grafana APIλ₯Ό μ¬μ©νμ¬ μ‘°μ§μ μ¬μ©μλ₯Ό μΆκ°νλ €κ³ νλ©΄ "μ¬μ©μλ₯Ό μ°Ύμ μ μμ" μ€λ₯κ° λ°μν©λλ€.
curl 'http://:@:3000/api/orgs/6/users' -X POST -H 'μ½ν μΈ μ ν: application/json;charset=UTF-8' --data-binary '{"loginOrEmail": "user1","role":"λ·°μ΄"}'
μ¬λ°λ₯Έ κΈ°λ³Έ μΈμ¦ μ격 μ¦λͺ
μ μ
λ ₯νμ΅λλ€. μ΄ λ¬Έμ μ λν ν΄κ²°μ±
μ΄ μμ΅λκΉ?
κ°μ¬ ν΄μ!
μ¬μ©μλ ν΄λΉ API νΈμΆκ³Ό ν¨κ» μ‘΄μ¬ν΄μΌ νλ©°, μ΄λ APIλ₯Ό μ¬μ©νμ¬ μ¬μ©μ μ΄λλ₯Ό μμ±ν μ μμ΅λλ€.
λλ κ°λ₯μ ν΅ν΄:
# Check that a page returns a status 200 and fail if the word AWESOME is not
# in the page contents.
- uri:
url: http://localhost:3000/api/datasources/name/Prometheus
user: admin
password: changeme
force_basic_auth: yes
register: grafana_prometheus
failed_when: false
changed_when: false
- name: Enable Prometheus Datasource
uri:
url: http://localhost:3000/api/datasources
method: POST
user: admin
password: changeme
body:
name: "Prometheus"
type: "prometheus"
url: "http://prometheus:9090"
access: "proxy"
isDefault: true
force_basic_auth: yes
status_code: 201
body_format: json
when: grafana_prometheus.status == 404
λ λ€λ₯Έ κ°λ₯ν μ‘°μΉλ Grafanaμ λ°μ΄ν°λ² μ΄μ€μ μ§μ μμ±νλ κ²μ λλ€. λλ μΌλ°μ μΌλ‘ λ°μ΄ν°λ² μ΄μ€λ₯Ό μμ±νκΈ° μν΄ Grafanaλ₯Ό μμνκ³ μ€μ§νκ³ sqliteλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ² μ΄μ€μ μμ€λ₯Ό μΆκ°ν©λλ€.
Grafana 4.0.2μ κ²½μ° λ€μκ³Ό κ°μ΅λλ€.
cat <<EOF | sqlite3 grafana.db || echo "Failed to add data source."
INSERT INTO data_source VALUES (2,1,0,'prometheus','prometheus','proxy','http://address',NULL,NULL,NULL,0,NULL,NULL,0,'{}','2017-01-15 20:00:00','2017-01-15 20:00:00',0,'{}');
EOF
CLIλ₯Ό μ¬μ©νμ¬ μ΄ μμ μ μνν©λλ€. λ΄κ° Grafanaλ₯Ό μν΄ μμ±ν λꡬ - wizzy https://github.com/utkarshcmu/wizzy
μ΄ λ¬Έμ λ₯Ό λ€μ μ΄ μ μμ΅λκΉ?
μνλ λ°μ΄ν° μμ€λ₯Ό μ μν μ μλ λλ ν 리λ₯Ό κ°κΈ° μν΄ dashboards.json
μ μ μ¬ν μ΅μ
μ λ§€μ° μν©λλ€.
μ¬κΈ°μλ μνΈμ€ν μνμ λ©μ΄λ¦¬κ° μμ΅λλ€(μμ κ°λ₯ν μ½λμ λ§€μ° μ μ¬ν¨). κ·Έκ²μ κ½€ μΆμ νμ§λ§ μΌμνλ κ² κ°μ΅λλ€.
http.query:
- name: http://localhost:3000/api/datasources
- method: POST
- username: admin
- password: admin
- data: |
{"name": "Prometheus",
"type": "prometheus",
"url": "http://localhost:9090",
"access": "proxy",
"isDefault": true}
- header_list:
- 'Content-Type: application/json'
- status: 200
- unless:
- curl -f http://admin:admin<strong i="6">@localhost</strong>:3000/api/datasources/name/Prometheus
μ΄κ²μ λ€μ μ΄λ©΄ 컬과 sqliteλ₯Ό μ΄μ§λ½νλ κ²μ΄ λ컀μμ λ μ§μ¦λ©λλ€. Dashboard.jsonκ³Ό κ°μ κΉ¨λν μ루μ μ κ΅μ₯ν κ²μ λλ€!
+1 μ μ ꡬμ±μμ ꡬμ±ν μ μμ΄μΌ ν©λλ€(μ: influxdb λ°μ΄ν° μμ€λ₯Ό μ¬μ©νμ¬ grafanaλ₯Ό μλμΌλ‘ μ€μ νκΈ° μν΄ docker-composeλ₯Ό μ¬μ©ν λ).
+1 json νμΌμ μ¬μ©νλ©΄ μ¬μ΄λ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ λμ κΌλκ°μμμ λ°λ‘ κ° ES μΈλ±μ€μ λν λ°μ΄ν° μμ€λ₯Ό μ½κ² μμ±ν μ μμ΅λλ€.
+1
2017λ
5μ 25μΌ λͺ©μμΌ μ€ν 5μ 36λΆ, Anton Timofieviev [email protected]
μΌλ€:
json νμΌλ‘ +1 κ° ES μΈλ±μ€μ λν λ°μ΄ν° μμ€λ₯Ό μ½κ² μμ±ν μ μμ
μ¬μ΄λ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ λμ κΌλκ°μμμ λ°λ‘β
μ΄ μ€λ λμ κ°μ νκΈ° λλ¬Έμ μ΄ λ©μμ§λ₯Ό λ°κ³ μμ΅λλ€.
μ΄ μ΄λ©μΌμ μ§μ λ΅μ₯νκ³ GitHubμμ νμΈνμΈμ.
https://github.com/grafana/grafana/issues/1789#issuecomment-304026003 ,
λλ μ€λ λ μμκ±°
https://github.com/notifications/unsubscribe-auth/AFrnv_CDln7rDTlqZK6r_stAFiek7jaHks5r9ZHfgaJpZM4EBJaL
.
π λ°μ΄ν° μμ€μ λν΄ μμ¬λ₯Ό 쿼리ν μ μμ(μ΄λ―Έ jsonμ)
HTTP API λλ conf νμΌμ ν΅ν΄ νλ ₯μ κ²μ μΈλΆ μ 보(μ: μΈλ±μ€ μ΄λ¦, μκ° νλ μ΄λ¦ λ° λ²μ )λ₯Ό ꡬμ±νλ λ°©λ²μ΄ κΆκΈν©λλ€. ν΄λΉ ꡬμ±μ λν ν€λ₯Ό μ°Ύμ μ μμ΅λλ€. κΈ°λ³Έ λμμ 무μμ λκΉ? @timtofanμ΄ λ§ν κ²μ²λΌ κ° μΈλ±μ€μ λν λ°μ΄ν° μμ€λ₯Ό μμ±ν©λκΉ?
curl --user admin:admin ' http://IPADDR :3000/api/datasources' -X POST -H 'μ½ν μΈ μ ν: application/json;charset=UTF-8' --data-binary '{"μ΄λ¦" :"test","type":"prometheus","url":" http://localhost :9090","access":"proxy","basicAuth":false}'
"isDefault": λ°μ΄ν° μμ€λ₯Ό κΈ°λ³Έκ°μΌλ‘ λ§λ€λ €λ©΄ true
prometheus λ°μ΄ν° μμ€λ₯Ό μΆκ°νλ λ°©λ²μ λ€μκ³Ό κ°μ΅λλ€.
curl --user admin:admin ' http://IPADDR :3000/api/datasources' -X POST -H 'μ½ν
μΈ μ ν: application/json;charset=UTF-8' --data-binary '{"μ΄λ¦" :"test","isDefault":true,"type":"prometheus","url":" http://localhost :9090","access":"proxy","basicAuth":false}'
κ΅¬μ± νμΌμ λ°μ΄ν° μμ€λ₯Ό λͺ¨λ μ‘°μ§μ μΆκ°ν μ μμ΅λκΉ?
λ§€μ° νΈλ¦¬ν κ²μ
λλ€.
μ’μ, μ΄κ²μ΄ μ΄λ―Έ λ«ν μλ€λ κ²μ μκ³ μμ§λ§ Grafana 5κ° μ½λμμ Dashboardλ₯Ό μ μν μ μλ€λ κ²μ 곡μ νκ³ μΆμμ΅λλ€. μΆκ° μ 보: http://docs.grafana.org/administration/provisioning/#datasources
κ°μ₯ μ μ©ν λκΈ
μ΄ λ¬Έμ λ₯Ό λ€μ μ΄ μ μμ΅λκΉ?
μνλ λ°μ΄ν° μμ€λ₯Ό μ μν μ μλ λλ ν 리λ₯Ό κ°κΈ° μν΄
dashboards.json
μ μ μ¬ν μ΅μ μ λ§€μ° μν©λλ€.