Harbor 監(jiān)控指標(biāo)分析

harbor version: 2.10.0

Harbor 監(jiān)控指標(biāo)主要包含以下幾個(gè)部分搓谆,具體可以參考 Harbor Exporter Metrics

  1. harbor health
  2. system info
  3. project info
  4. job service

代碼https://github.com/goharbor/harbor/blob/8bec57ffd45b4bd31e190ae3b499086eb5d9cb07/src/pkg/exporter/exporter.go#L50

harbor health

harbor health 通過調(diào)用 /api/v2.0/health 查詢,代碼如下:

https://github.com/goharbor/harbor/blob/8bec57ffd45b4bd31e190ae3b499086eb5d9cb07/src/pkg/exporter/health_collector.go#L26

~/go/src/xxx/harborctl (master ?) curl -k -u 'user@password' -X GET https://reg.srv.xxx.cn/api/v2.0/health | jq
{
  "components": [
    {
      "name": "core",
      "status": "healthy"
    },
    {
      "name": "database",
      "status": "healthy"
    },
    {
      "name": "jobservice",
      "status": "healthy"
    },
    {
      "name": "portal",
      "status": "healthy"
    },
    {
      "name": "redis",
      "status": "healthy"
    },
    {
      "name": "registry",
      "status": "healthy"
    },
    {
      "name": "registryctl",
      "status": "healthy"
    }
  ],
  "status": "healthy"
}

System info

system info 通過調(diào)用 /api/v2.0/systeminfo查詢归苍,代碼如下:

https://github.com/goharbor/harbor/blob/8bec57ffd45b4bd31e190ae3b499086eb5d9cb07/src/pkg/exporter/system_collector.go#L29

~/go/src/xxx/harborctl (master ?) curl -k -u 'user@password' -X GET https://reg.srv.xxx.cn/api/v2.0/systeminfo | jq
{
  "auth_mode": "ldap_auth",
  "banner_message": "",
  "current_time": "2024-03-12T03:54:47.921Z",
  "external_url": "https://reg.srv.xxx.cn",
  "harbor_version": "v2.10.0-6abb4eab",
  "has_ca_root": false,
  "notification_enable": true,
  "oidc_provider_name": "",
  "primary_auth_mode": false,
  "project_creation_restriction": "adminonly",
  "read_only": false,
  "registry_storage_provider_name": "s3",
  "registry_url": "reg.srv.xxx.cn",
  "self_registration": false
}

Project info

Project info 通過讀取數(shù)據(jù)庫(kù)記錄進(jìn)行查詢宠默,代碼如下:

https://github.com/goharbor/harbor/blob/8bec57ffd45b4bd31e190ae3b499086eb5d9cb07/src/pkg/exporter/project_collector.go#L30

harbor=> SELECT project_metadata.value AS public, COUNT(project_metadata.value) AS count
harbor-> FROM project INNER JOIN project_metadata ON project.project_id=project_metadata.project_id
harbor-> WHERE project.deleted=FALSE AND project_metadata.name='public'
harbor-> GROUP BY project_metadata.value;
 public | count 
--------+-------
 true   |    19
 false  |    12
(2 rows)
harbor=> SELECT project.project_id, project.name, project_metadata.value AS public, quota.hard AS quota, quota_usage.used AS usage FROM project
harbor-> INNER JOIN project_metadata ON (project.project_id = project_metadata.project_id)
harbor-> INNER JOIN quota ON project.project_id = CAST(quota.reference_id AS Integer)
harbor-> INNER JOIN quota_usage ON project.project_id = CAST(quota_usage.reference_id AS Integer)
harbor-> WHERE quota.reference='project' AND quota_usage.reference='project' AND project.deleted=FALSE AND project_metadata.name='public';
 project_id |             name              | public |           quota           |            usage            
------------+-------------------------------+--------+---------------------------+-----------------------------
         28 | xxx-prediction          | false  | {"storage": -1}           | {"storage": 66540139800}
         19 | hivesec                       | true   | {"storage": -1}           | {"storage": 29397564588}
         23 | kubeedge-cd                   | false  | {"storage": -1}           | {"storage": 27229995516}
         69 | xxx-onboard-system      | true   | {"storage": -1}           | {"storage": 15794403147}
         18 | infra-operation               | false  | {"storage": -1}           | {"storage": 1086170972483}
         29 | xxx-common-test         | true   | {"storage": 536870912000} | {"storage": 10326108416}
          3 | xxx-all                 | true   | {"storage": -1}           | {"storage": 5141042260695}
          4 | xxx-ai-platform         | true   | {"storage": -1}           | {"storage": 33540785742}
         17 | xxx-test                | true   | {"storage": -1}           | {"storage": 60594336086}
         16 | perception-test               | true   | {"storage": -1}           | {"storage": 1281251136969}
         67 | cloud-test                    | true   | {"storage": -1}           | {"storage": 35962611310}
         11 | xxx-simulation-services | true   | {"storage": -1}           | {"storage": 962089168777}
         34 | xxx-edge                | true   | {"storage": -1}           | {"storage": 396728976}
          8 | xxx-production          | false  | {"storage": -1}           | {"storage": 778171807755}
         32 | simulation-jobs               | true   | {"storage": -1}           | {"storage": 7500526904231}
         68 | xxx-tke                 | false  | {"storage": -1}           | {"storage": 24142197231}
          5 | xxx-development         | false  | {"storage": -1}           | {"storage": 865725642635}
         24 | xxx-modules-all         | true   | {"storage": -1}           | {"storage": 28905956667895}
          1 | library                       | true   | {"storage": -1}           | {"storage": 35962611310}
          6 | xxx-infra               | false  | {"storage": -1}           | {"storage": 1599663489}
         14 | xxx-uat                 | false  | {"storage": -1}           | {"storage": 19526673706}
         25 | xxx-ui                  | true   | {"storage": -1}           | {"storage": 150635978}
         10 | xxx-simulation          | true   | {"storage": -1}           | {"storage": 7349189814197}
         21 | xxx-rd-testing          | false  | {"storage": -1}           | {"storage": 1899226810}
         31 | data-closedloop               | true   | {"storage": -1}           | {"storage": 20697007871}
         27 | xxx-production-external | false  | {"storage": -1}           | {"storage": 233172664}
         15 | google_containers             | true   | {"storage": -1}           | {"storage": 235452327}
          9 | xxx-public              | true   | {"storage": -1}           | {"storage": 1606672360903}
         12 | xxx-staging             | false  | {"storage": -1}           | {"storage": 607922059044}
         13 | xxx-training-framework  | true   | {"storage": -1}           | {"storage": 22876361554}
          7 | xxx-perception          | false  | {"storage": -1}           | {"storage": 749309031}
(31 rows)
harbor=> SELECT project.project_id, COUNT(project.project_id) AS member_total
harbor-> FROM project INNER JOIN project_member ON project.project_id=project_member.project_id
harbor-> WHERE project.deleted=FALSE AND project_member.entity_type='u'
harbor-> GROUP BY project.project_id, project_member.entity_type;
 project_id | member_total 
------------+--------------
         11 |            6
          1 |            2
          5 |           10
         12 |           10
         68 |            2
         10 |            2
         19 |            3
         27 |            2
         21 |            4
         23 |            9
          4 |            3
         29 |            6
         14 |            2
          3 |           40
         24 |            7
         32 |            4
          6 |            2
         15 |            2
         28 |            5
          9 |           21
          7 |            2
          8 |            9
         34 |            3
         18 |           10
         31 |            2
         17 |           10
         13 |            4
         69 |            4
         67 |            1
         25 |            4
         16 |           11
(31 rows)
harbor=> SELECT repository.project_id, COUNT(repository.project_id) AS repo_total, SUM(repository.pull_count) AS pull_total
harbor-> FROM  project INNER JOIN repository ON project.project_id=repository.project_id
harbor-> WHERE project.deleted=FALSE
harbor-> GROUP BY repository.project_id;
 project_id | repo_total | pull_total 
------------+------------+------------
         29 |          5 |          0
         68 |          9 |          0
          4 |         68 |          0
         34 |          1 |          0
         67 |          4 |          5
         32 |          2 |          0
         10 |         27 |          0
          7 |          1 |          0
          9 |       1446 |          0
         15 |          7 |          0
          6 |          9 |          0
         12 |        147 |          0
         24 |       8730 |          0
         19 |         84 |          0
         25 |          3 |          0
         69 |          3 |          0
         31 |         12 |          0
         21 |          2 |          0
         14 |         17 |          0
          3 |        522 |          0
         17 |         76 |          0
         28 |          6 |          0
         13 |          1 |          0
          1 |          4 |          0
          5 |        201 |          2
         18 |       2054 |          0
         16 |        206 |          0
         27 |          6 |          0
         23 |         52 |          0
         11 |        107 |          0
          8 |        215 |          0
(31 rows)
harbor=> SELECT artifact.project_id, artifact.type AS artifact_type, COUNT(artifact.type) AS artifact_total
harbor-> FROM project INNER JOIN artifact ON project.project_id=artifact.project_id
harbor-> WHERE project.deleted=FALSE
harbor-> GROUP BY artifact.project_id, type;
 project_id | artifact_type | artifact_total 
------------+---------------+----------------
          1 | IMAGE         |             43
          3 | IMAGE         |           8915
          4 | IMAGE         |             80
          5 | IMAGE         |          11017
          6 | IMAGE         |             47
          7 | IMAGE         |              1
          8 | IMAGE         |           7276
          9 | IMAGE         |          12395
          9 | UNKNOWN       |              1
         10 | IMAGE         |           2358
         11 | IMAGE         |          12426
         12 | IMAGE         |           6912
         13 | IMAGE         |              8
         14 | IMAGE         |            900
         15 | IMAGE         |              8
         16 | IMAGE         |            964
         17 | IMAGE         |            364
         18 | CHART         |              2
         18 | IMAGE         |          13867
         19 | IMAGE         |            102
         21 | IMAGE         |              4
         23 | IMAGE         |            222
         24 | IMAGE         |          40259
         25 | IMAGE         |             44
         27 | IMAGE         |             56
         28 | IMAGE         |             18
         29 | IMAGE         |              6
         31 | IMAGE         |             35
         32 | IMAGE         |           3221
         34 | IMAGE         |             52
         67 | IMAGE         |             43
         68 | IMAGE         |             66
         69 | IMAGE         |             20
(33 rows)

Job service

以下幾個(gè) task 相關(guān)的 metrics 是通過 harbor exporter 組件進(jìn)行獲取的麸恍。

https://github.com/goharbor/harbor/blob/dbe9790147b8ec4ad6aabe7a6665edfe998d99d5/src/pkg/exporter/js_collector.go#L25

task_queue_size, task_queue_latency

r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379[1]> LLEN "{harbor-server}:jobs:GARBAGE_COLLECTION"
(integer) 0
r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379[1]> LINDEX "{harbor-server}:jobs:GARBAGE_COLLECTION" -1
(nil)

task_concurrency

?? /home/xxx/liangzheng ? redis-cli -h r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com -a <password>
r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379> SELECT 1
OK
r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379[1]> SMEMBERS "{harbor-server}:known_jobs"
 1) "GARBAGE_COLLECTION"
 2) "REPLICATION"
 3) "IMAGE_SCAN"
 4) "IMAGE_SCAN_ALL"
 5) "WEBHOOK"
 6) "SCAN_DATA_EXPORT"
 7) "SCHEDULER"
 8) "PURGE_AUDIT_LOG"
 9) "DEMO"
10) "EXECUTION_SWEEP"
11) "IMAGE_GC"
12) "RETENTION"
13) "IMAGE_REPLICATE"
14) "SLACK"
15) "SYSTEM_ARTIFACT_CLEANUP"
16) "AUDIT_LOGS_GDPR_COMPLIANT"
17) "P2P_PREHEAT"
r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379[1]> HGETALL "{harbor-server}:jobs:REPLICATION:lock_info"
1) "df1fa66ce3992cc9e1449483"
2) "0"
3) "1ef8a49c990d15220fd5443c"
4) "0"
5) "3280a0bc80141409ac2d9e27"
6) "0"

task_scheduled_total

r-wz9m4ifqyj1opzlies.redis.rds.aliyuncs.com:6379[1]> ZRANGEBYSCORE "{harbor-server}:scheduled" -inf +inf withscores limit 0 20
(empty list or set)

以下三個(gè)參數(shù)是通過 Harbor Jobservice 組件獲取的,代碼如下:

https://github.com/goharbor/harbor/blob/8bec57ffd45b4bd31e190ae3b499086eb5d9cb07/src/lib/metric/jobservice.go#L34

jobservice_info

Jobservice info 包括:

  1. node 信息
  2. redis pool id
  3. redis worker count搀矫,這個(gè)值首先會(huì)從環(huán)境變量 JOB_SERVICE_POOL_WORKERS中讀取抹沪,如果不設(shè)置則默認(rèn)為 10
# HELP jobservice_info the information of jobservice
# TYPE jobservice_info gauge
jobservice_info{node="harbor-jobservice-64644b6477-d4pl5:10.233.107.26",pool="2ca124a2f99043abecdd4ba9",workers="10"} 1

jobservice_task_process_time_seconds 和 jobservice_task_total

各種 type(例如 EXECUTION_SWEEP, SCHEDULER 等等) 的 job (fail, stop, success)運(yùn)行時(shí)間和狀態(tài)統(tǒng)計(jì)

# HELP jobservice_task_process_time_seconds The time duration of the task processing time
# TYPE jobservice_task_process_time_seconds summary
jobservice_task_process_time_seconds{status="success",type="EXECUTION_SWEEP",quantile="0.5"} NaN
jobservice_task_process_time_seconds{status="success",type="EXECUTION_SWEEP",quantile="0.9"} NaN
jobservice_task_process_time_seconds{status="success",type="EXECUTION_SWEEP",quantile="0.99"} NaN
jobservice_task_process_time_seconds_sum{status="success",type="EXECUTION_SWEEP"} 0.512839206
jobservice_task_process_time_seconds_count{status="success",type="EXECUTION_SWEEP"} 1
# HELP jobservice_task_total The number of processed tasks
# TYPE jobservice_task_total counter
jobservice_task_total{status="success",type="EXECUTION_SWEEP"} 1
jobservice_task_total{status="success",type="SCHEDULER"} 1

參考鏈接

https://github.com/gocraft/work
https://goharbor.io/docs/2.10.0/administration/jobservice-dashboard/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刻肄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子采够,更是在濱河造成了極大的恐慌肄方,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬癌,死亡現(xiàn)場(chǎng)離奇詭異权她,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逝薪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門隅要,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人董济,你說我怎么就攤上這事步清。” “怎么了虏肾?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵廓啊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我封豪,道長(zhǎng)谴轮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任吹埠,我火速辦了婚禮第步,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缘琅。我一直安慰自己粘都,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布刷袍。 她就那樣靜靜地躺著翩隧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呻纹。 梳的紋絲不亂的頭發(fā)上鸽心,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音居暖,去河邊找鬼。 笑死藤肢,一個(gè)胖子當(dāng)著我的面吹牛太闺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嘁圈,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼省骂,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蟀淮!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起钞澳,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤怠惶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后轧粟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體策治,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年兰吟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了通惫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡混蔼,死狀恐怖履腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惭嚣,我是刑警寧澤遵湖,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站晚吞,受9級(jí)特大地震影響延旧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜载矿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一垄潮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闷盔,春花似錦弯洗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至溺拱,卻和暖如春逃贝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背迫摔。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工沐扳, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人句占。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓沪摄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子杨拐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容