Apache Pulsar 之 Functions Debug

Apache Pulsar 之 Functions Debug

在之前的文章 Java Functions楞陷、Python Functions吟榴、Go Functions 中塘幅,向大家詳細介紹了如何基于自己的場景快速編寫并部署 Pulsar Functions骤竹。這篇文章蛾派,會介紹如何利用 Pulsar 提供的 CLI 對 Functions 進行 Debug俄认。

使用 LogTopic

Pulsar Functions 在設計之初个少,就考慮到如何對 Pulsar Functions 進行 Debug。如下圖所示眯杏,Pulsar Functions 允許用戶將自己在 Functions 中定義好的日志信息輸出到指定的 LogTopic 中夜焦,如果有遇到相關的問題需要從日志信息中獲取,用戶可以編寫 consumer 從指定的 LogTopic 中消費消息岂贩,即可查看相關的日志信息茫经。

具體使用如下:

import org.apache.pulsar.functions.api.Context;
import org.apache.pulsar.functions.api.Function;
import org.slf4j.Logger;

public class LoggingFunction implements Function<String, Void> {
    @Override
    public void apply(String input, Context context) {
        Logger LOG = context.getLogger();
        String messageId = new String(context.getMessageId());

        if (input.contains("danger")) {
            LOG.warn("A warning was received in message {}", messageId);
        } else {
            LOG.info("Message {} received\nContent: {}", messageId, input);
        }

        return null;
    }
}

如上述代碼所示,用戶可以通過 context.getLogger() 獲取 logger 對象并將其賦值給 slf4jLOG 字段萎津,這樣用戶就可以使用 LOG 字段在 Pulsar Functions 中定義自己想要的日志信息卸伞。當你有日志信息需要輸出時,在啟動過程中锉屈,需要告訴 Pulsar Functions 你期望將日志信息輸出到哪一個 topic 中荤傲,具體使用如下:

$ bin/pulsar-admin functions create \
  --log-topic persistent://public/default/logging-function-logs \
  # Other function configs

Functions CLI

除了使用 LogTopic 通過自定義日志信息的方式來追蹤 Functions 的問題之外,用戶還以通過使用 Functions CLI 對 Pulsar Functions 進行相關的 Debug 工作部念。

關于 Pulsar Functions 相關的 CLI弃酌,Pulsar 將其集成到 pulsar-admin 下,你可以使用 ./bin/pulsar-adminFunctions 告訴 Pulsar儡炼,你要執(zhí)行和 Pulsar Functions 相關的操作妓湘。為了方便用戶定位問題,Pulsar Functions 提供了如下幾種 CLI:

  • get
  • stats
  • trigger
  • list
  • status

get

使用 get 命令可以獲取當前 Pulsar Functions 的詳細信息乌询,它提供了如下參數(shù)列表供用戶使用:

  • FQFN
  • name
  • tenant
  • namespace

需要說明的是榜贴,F(xiàn)QFN(Fully Qualified Functions Name)是由 tenantnamespacename 這三個字段組成妹田,它可以唯一標識一個 Pulsar Functions唬党,用戶在使用時,可以使用 FQFN 或者同時指定 tenant鬼佣、namespacename 這三個字段驶拱。示例如下:

$ ./bin/pulsar-admin functions get \
    --tenant public \
    --namespace default \
    --name ExclamationFunctio6

執(zhí)行如上命令之后,輸出如下:

{
  "tenant": "public",
  "namespace": "default",
  "name": "ExclamationFunctio6",
  "className": "org.example.test.ExclamationFunction",
  "inputSpecs": {
    "persistent://public/default/my-topic-1": {
      "isRegexPattern": false
    }
  },
  "output": "persistent://public/default/test-1",
  "processingGuarantees": "ATLEAST_ONCE",
  "retainOrdering": false,
  "userConfig": {},
  "runtime": "JAVA",
  "autoAck": true,
  "parallelism": 1
}

通過 get 命令晶衷,你可以獲取到當前 Pulsar Functions 具體的輸入蓝纲、輸出,運行的 rutime 是什么晌纫,當前 Functions 中有多少個 instance 在運行等信息税迷。

list

list 命令可以獲取當前 namespace 下有哪些 Functions 在運行,會返回運行的 Functions 的 name 列表锹漱,它提供了如下參數(shù)列表供用戶使用:

  • tenant
  • namespace

參考示例如下:

$ ./bin/pulsar-admin functions list \
    --tenant public \
    --namespace default

執(zhí)行如上命令之后箭养,輸出如下:

ExclamationFunctio1
ExclamationFunctio2
ExclamationFunctio3

上述輸出說明,在 default 這個 namespace 下哥牍,運行了三個 Pulsar Functions毕泌。

trigger

trigger 命令會模擬 Functions 執(zhí)行的過程喝检,可以用來驗證當前 Functions 運行的整個鏈路是否正常,它提供了如下參數(shù)列表供用戶使用:

  • FQFN
  • tenant
  • namespace
  • name
  • topic
  • trigger-file
  • trigger-value

參考示例如下:

$ ./bin/pulsar-admin functions trigger \
    --tenant public \
    --namespace default \
    --name ExclamationFunctio6 \
    --topic persistent://public/default/my-topic-1 \
    --trigger-value "hello pulsar functions"

執(zhí)行成功之后會輸出 This is my function!

注意:在使用 --topic 指定具體的 topic 時撼泛,需要使用 topic 的全稱蛇耀,否則會出現(xiàn)如下錯誤:

Function in trigger function has unidentified topic

Reason: Function in trigger function has unidentified topic

status

使用 status 命令可以查看當前 Functions 運行的狀態(tài)信息,它提供了如下參數(shù)列表供用戶使用:

  • FQFN
  • tenant
  • namespace
  • name
  • instance-id

參考示例如下:

$ ./bin/pulsar-admin functions status \
    --tenant public \
    --namespace default \
    --name ExclamationFunctio6 \

執(zhí)行上述命令后坎弯,輸出如下:

{
  "numInstances" : 1,
  "numRunning" : 1,
  "instances" : [ {
    "instanceId" : 0,
    "status" : {
      "running" : true,
      "error" : "",
      "numRestarts" : 0,
      "numReceived" : 1,
      "numSuccessfullyProcessed" : 1,
      "numUserExceptions" : 0,
      "latestUserExceptions" : [ ],
      "numSystemExceptions" : 0,
      "latestSystemExceptions" : [ ],
      "averageLatency" : 0.8385,
      "lastInvocationTime" : 1557734137987,
      "workerId" : "c-standalone-fw-23ccc88ef29b-8080"
    }
  } ]
}

可以看到在 status 命令中,你可以查看到當前 Functions 是否處于運行狀態(tài)译暂,總共接收了多少條消息抠忘,成功處理了多少條消息,系統(tǒng)發(fā)生過多少次錯誤外永,平均延遲為多少等崎脉。由于一個 Functions 可以運行多個 instance,所以可以通過 --instance-id 來具體查看某一個 instance 的詳細信息伯顶。在上述示例中囚灼,在 ExclamationFunctio6 的 Functions 下只運行了一個 instance。

stats

stats 命令主要用來獲取當前 Functions 的統(tǒng)計信息祭衩,它提供了如下參數(shù)列表供用戶使用:

  • FQFN
  • tenant
  • namespace
  • name
  • instance-id

參數(shù)列表的含義與 status 命令一致灶体,參考示例如下:

$ ./bin/pulsar-admin functions stats \
    --tenant public \
    --namespace default \
    --name ExclamationFunctio6 \

執(zhí)行上述命令后,輸出如下:

{
  "receivedTotal" : 1,
  "processedSuccessfullyTotal" : 1,
  "systemExceptionsTotal" : 0,
  "userExceptionsTotal" : 0,
  "avgProcessLatency" : 0.8385,
  "1min" : {
    "receivedTotal" : 0,
    "processedSuccessfullyTotal" : 0,
    "systemExceptionsTotal" : 0,
    "userExceptionsTotal" : 0,
    "avgProcessLatency" : null
  },
  "lastInvocation" : 1557734137987,
  "instances" : [ {
    "instanceId" : 0,
    "metrics" : {
      "receivedTotal" : 1,
      "processedSuccessfullyTotal" : 1,
      "systemExceptionsTotal" : 0,
      "userExceptionsTotal" : 0,
      "avgProcessLatency" : 0.8385,
      "1min" : {
        "receivedTotal" : 0,
        "processedSuccessfullyTotal" : 0,
        "systemExceptionsTotal" : 0,
        "userExceptionsTotal" : 0,
        "avgProcessLatency" : null
      },
      "lastInvocation" : 1557734137987,
      "userMetrics" : { }
    }
  } ]
}

運行 Pulsar Functions 出現(xiàn)問題時掐暮,你可以結合上述 Debug 命令和自定義的日志信息蝎抽,對 Pulsar Functions 的問題進行很好的定位和分析。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末路克,一起剝皮案震驚了整個濱河市樟结,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌精算,老刑警劉巖瓢宦,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灰羽,居然都是意外死亡驮履,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門谦趣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疲吸,“玉大人,你說我怎么就攤上這事前鹅≌玻” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵舰绘,是天一觀的道長蹂喻。 經(jīng)常有香客問我葱椭,道長,這世上最難降的妖魔是什么口四? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任孵运,我火速辦了婚禮,結果婚禮上蔓彩,老公的妹妹穿的比我還像新娘治笨。我一直安慰自己,他們只是感情好赤嚼,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布旷赖。 她就那樣靜靜地躺著,像睡著了一般更卒。 火紅的嫁衣襯著肌膚如雪等孵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天蹂空,我揣著相機與錄音俯萌,去河邊找鬼。 笑死上枕,一個胖子當著我的面吹牛咐熙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辨萍,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼糖声,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了分瘦?” 一聲冷哼從身側響起蘸泻,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘲玫,沒想到半個月后悦施,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡去团,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年抡诞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片土陪。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡昼汗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鬼雀,到底是詐尸還是另有隱情顷窒,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站鞋吉,受9級特大地震影響鸦做,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谓着,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一泼诱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赊锚,春花似錦治筒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阿纤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間夷陋,已是汗流浹背欠拾。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留骗绕,地道東北人藐窄。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像酬土,于是被迫代替她去往敵國和親荆忍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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