क्लाउड फ़ंक्शन लॉग इन और ट्रेसिंग कोडलैब

इस कोडलैब का मकसद यह समझना है कि सभी क्लाउड फ़ंक्शन डेवलपर को दिए जाने वाले लॉगिंग और मॉनिटरिंग टूल का फ़ायदा कैसे लिया जाए. ये टूल हर क्लाउड फ़ंक्शन के साथ आते हैं, जिन्हें आप काम करने वाली सभी भाषाओं में डिप्लॉय करते हैं. साथ ही, इससे आपको बिना सर्वर वाला कोड लिखने और चलाने में ज़्यादा काम करने में मदद मिलती है.

हम यहां एचटीटीपी-ट्रिगर वाले फ़ंक्शन का इस्तेमाल करेंगे. हालांकि, हम जो भी कवर करते हैं वह दूसरी भाषाओं पर लागू होता है. साथ ही, दूसरे इवेंट (स्टोरेज बकेट, पब/सब वगैरह) से ट्रिगर होने वाले फ़ंक्शन पर भी लागू होता है.

अपनी सुविधा के हिसाब से एनवायरमेंट सेट अप करना

अगर आपके पास पहले से कोई Google खाता (Gmail या Google Apps) नहीं है, तो आपको एक खाता बनाना होगा. Google Cloud Platform Console (console.cloud.google.com) में साइन इन करें और एक नया प्रोजेक्ट बनाएं:

10-02-2016 का स्क्रीनशॉट 12:45:26.png

प्रोजेक्ट आईडी याद रखें, सभी Google क्लाउड प्रोजेक्ट में दिया गया नाम (ऊपर दिया गया नाम पहले ही लिया जा चुका है और यह आपके लिए काम नहीं करेगा!). इसे बाद में इस कोडलैब (कोड बनाना सीखना) में PROJECT_ID के तौर पर बताया जाएगा.

इसके बाद, आपको Google Cloud के संसाधनों का इस्तेमाल करने के लिए, Cloud Console में बिलिंग को चालू करना होगा.

इस कोडलैब के जवाब में कुछ डॉलर से ज़्यादा खर्च नहीं करना चाहिए. हालांकि, अगर आप संसाधनों का इस्तेमाल करना जारी रखते हैं या उन्हें चलाना बंद कर देते हैं, तो यह ज़्यादा भी हो सकता है.

Google Cloud Platform के नए उपयोगकर्ता, 300 डॉलर का मुफ़्त ट्रायल पा सकते हैं.

Google Cloud Shell

हालांकि, Google Cloud फ़ंक्शन और लॉग करने और मॉनिटर करने की सुविधा का इस्तेमाल आपके लैपटॉप से दूर से किया जा सकता है, लेकिन इस कोडलैब में हम Google Cloud Shell का इस्तेमाल करेंगे. यह क्लाउड में चलने वाले कमांड लाइन एनवायरमेंट है.

Debian वाली वर्चुअल मशीन में डेवलपमेंट के लिए ज़रूरी सभी टूल हैं. इसमें लगातार 5 जीबी की होम डायरेक्ट्री मिलती है. यह Google Cloud पर चलती है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती जाती है. इसका मतलब है कि इस कोडलैब के लिए आपको सिर्फ़ एक ब्राउज़र की ज़रूरत है (हां, यह Chromebook पर काम करता है).

Google Cloud Shell को चालू करने के लिए, डेवलपर कंसोल से सबसे ऊपर दाईं ओर मौजूद बटन पर क्लिक करें. प्रावधान करने और आस-पास के सिस्टम से कनेक्ट करने में, कुछ ही समय लगेगा:

CloudShell.png को चालू करें

& & दिया को Cloud Shell" बटन पर क्लिक करें:

14-06-2017 को सुबह 10.13.43 बजे के लिए स्क्रीन शॉट

क्लाउड शेल से कनेक्ट होने के बाद, आपको दिखेगा कि पहले से ही आपकी पुष्टि हो चुकी है और प्रोजेक्ट पहले से ही PROJECT_ID पर सेट है:

gcloud auth list

कमांड आउटपुट

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

कमांड आउटपुट

[core]
project = <PROJECT_ID>

Cloud Shell डिफ़ॉल्ट रूप से, कुछ एनवायरमेंट वैरिएबल भी सेट करता है. ये आने वाले समय में निर्देश देने के दौरान काम के हो सकते हैं.

echo $GOOGLE_CLOUD_PROJECT

कमांड आउटपुट

<PROJECT_ID>

अगर किसी वजह से प्रोजेक्ट सेट नहीं किया गया है, तो बस यह निर्देश दें :

gcloud config set project <PROJECT_ID>

क्या आप PROJECT_ID ढूंढ रहे हैं? देखें कि आपने सेट अप चरणों में किस आईडी का इस्तेमाल किया था या कंसोल डैशबोर्ड में उसे देखें:

Project_ID.png

अहम जानकारी: आखिर में, डिफ़ॉल्ट ज़ोन और प्रोजेक्ट कॉन्फ़िगरेशन सेट करें:

gcloud config set compute/zone us-central1-f

आप कई तरह के ज़ोन चुन सकते हैं. ज़्यादा जानकारी के लिए, क्षेत्र और ज़ोन के दस्तावेज़ देखें.

निगरानी करने के लिए कुछ न कुछ करने के लिए, चलिए #39; Hello World का क्लाउड फ़ंक्शन बनाते हैं. कंसोल के बाएं मेन्यू में, Cloud फ़ंक्शन पर क्लिक करें. इसके बाद, &&कोटेशन करें;Create function :

अपने नए फ़ंक्शन का नाम रखें & & "hello-monitor" :

... और सोर्स कोड के सभी डिफ़ॉल्ट को बनाए रखें (हालांकि, अगर आपको #39; पसंद है, तो कोई दूसरी भाषा/रनटाइम चुनें) :

आखिर में, & &कोटेशन; बटनCreate का इस्तेमाल करके फ़ंक्शन बनाएं :

कुछ देर बाद, आपको अपना फ़ंक्शन शुरू किए जाने के लिए तैयार दिखेगा (जैसा कि हरे चेकमार्क में दिखाया गया है) :

क्लाउड फ़ंक्शन को डिप्लॉय करने के बाद, हम कमांड लाइन से इसकी जांच करेंगे.

सबसे पहले, Cloud Shell का इस्तेमाल करके, यह निर्देश दें :

$ gcloud functions describe hello-monitor

इससे फ़ंक्शन का विवरण मिलना चाहिए, जिसमें httpsTrigger का यूआरएल शामिल है जो कि फ़ंक्शन को शुरू करने का HTTP(S) एंडपॉइंट होता है. यह इस रूप में होना चाहिए : https://<region>-<project-id>.cloudfunctions.net/hello-monitor

फ़ंक्शन को ट्रिगर करना अब curl और #39; इस यूआरएल को ट्रिगर करने जितना आसान है :

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

अब हम Vegeta का इस्तेमाल करेंगे. यह एक आसान एचटीटीपी लोड टेस्टिंग टूल है. इसे इंस्टॉल करने के लिए, Cloud Shell से, बस यह निर्देश लिखें :

$ go get -u github.com/tsenart/vegeta

अपने क्लाउड फ़ंक्शन पर कुछ ट्रैफ़िक भेजने के लिए (कुछ मिनटों के लिए पांच सेकंड प्रति सेकंड), इस निर्देश का इस्तेमाल करें :

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

अपने फ़ंक्शन की जानकारी वाले व्यू से, &लॉग;कोटेशन देखें; दाईं ओर मौजूद मेन्यू पर क्लिक करें :

यह आपको अपने प्रोजेक्ट के स्टैकड्राइवर लॉगिंग सेक्शन पर ले जाएगा, जो आपको सिर्फ़ क्लाउड फ़ंक्शन लॉग दिखाता है :

उम्मीद है कि आपके फ़ंक्शन के लिए सभी अनुरोध 200 स्टेटस कोड दिखाएंगे.

इस लॉग व्यूअर का इस्तेमाल करके आप :

  • लॉग लेवल के हिसाब से फ़िल्टर करें (हमारे मामले में सभी लॉग Debug लेवल हैं)
  • कोई खास समयसीमा चुनें (सापेक्ष या सटीक)
  • लॉग स्ट्रीमिंग सक्षम करें (स्क्रीन के शीर्ष पर &कोटेशन चलाएं&कोट करें) बटन
  • लॉग एंट्री का लिंक कॉपी करें (टीम के सदस्यों के साथ शेयर करने के लिए)
  • संसाधन कॉन्टेक्स्ट में लॉग एंट्री दिखाएं
  • लॉग एंट्री पिन करें (विज़ुअल क्यू के रूप में)
  • लॉग को BigQuery, Cloud Storage या Cloud Pub/Sub में एक्सपोर्ट करना (या उन्हें सिर्फ़ JSON या CSV फ़ॉर्मैट में डाउनलोड करना)

यह भी ध्यान रखें कि सबसे ऊपर बाईं ओर मौजूद सिलेक्टर, फ़ंक्शन के हिसाब से लॉग फ़िल्टर कर सकता है. आप विंडो के ऊपर दिए गए खोज बार में लेबल या पूरे लेख की खोज भी कर सकते हैं. हमारे मामले में लेबल hello-monitor (फ़ंक्शन का नाम) के साथ-साथ हर अनुरोध के लिए एक्ज़ीक्यूशन आइडेंटिफ़ायर होते हैं.

शेयर करने के लिए फ़िल्टर भी कॉपी किए जा सकते हैं (खोज बॉक्स में ड्रॉप-डाउन मेन्यू देखें) :

कंसोल का इस्तेमाल करके, "फ़ंक्शन की जानकारी &कोटेशन; नेविगेट करें. साथ ही, हमारे लोड टेस्टर की संख्या में हुई बढ़ोतरी भी देखें और देखें, दोनों ही हर सेकंड के शुरू होने की संख्या और उनके चलने के समय के आधार पर :

इंतज़ार के समय और आरपीसी कॉल की निगरानी के लिए, एक और बेहतरीन टूल स्टैकड्राइवर ट्रेस सुविधा है. हालांकि, इस सुविधा का इस्तेमाल करने से पहले, हमें अपने फ़ंक्शन में कुछ बदलाव करने होंगे, जैसे:

  1. निर्भरता के तौर पर, ज़िंदगी बचाने वाला node-emoji पैकेज जोड़ें
  2. नोड इमोजी का इस्तेमाल करने और कुछ इंतज़ार के समय की जानकारी देने के लिए, फ़ंक्शन कोड अपडेट करें
  3. क्लाउड फ़ंक्शन के लिए स्टैकड्राइवर ट्रेस चालू करने के लिए, एनवायरमेंट वैरिएबल जोड़ें

&फ़ंक्शन को&कोटेशन; पेज से फ़ंक्शन में बदलाव करने के लिए बदलाव करें पर क्लिक करें :

node-emoji पैकेज के लिए, डिपेंडेंसी जोड़ने के लिए package.json फ़ाइल में बदलाव करें :

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

वास्तविक कॉन्टेंट में बदलाव करें, ताकि index.js के कॉन्टेंट में ये बदलाव किए जा सकें :

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

इससे 300 मिलीसेकंड तक काम करने के बाद फ़ंक्शन से मिलने वाले मैसेज में कोई भी इमोजी जुड़ जाएगा.

आखिर में, GOOGLE_CLOUD_TRACE_ENABLED नाम का एक क्लाउड फ़ंक्शन एनवायरमेंट वैरिएबल जोड़ें और true को इस तरह से सेट करें:

सेव करें पर क्लिक करना न भूलें!

अब Cloud Shell पर वापस जाएं और हाल ही में डिप्लॉय किए गए फ़ंक्शन पर कुछ लोड जनरेट करने के लिए निर्देश को याद रखें :

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

हम अब #39; ट्रेस की सूची देखने के लिए तैयार हैं, जिसे सेट अप करने की ज़रूरत नहीं है और आपके कोड में कोई खास ट्रेसिंग लाइब्रेरी नहीं है!

बाईं ओर दिए गए मेन्यू का इस्तेमाल करके, ट्रेस सूची (स्टैकड्राइवर ट्रेस में) पर जाएं:

आपको इस स्क्रीन कैप्चर के जैसा कुछ दिखाई देना चाहिए :

इससे यह साफ़ तौर पर पता चल जाना चाहिए कि हमारे फ़ंक्शन में इंतज़ार का समय असल में 300 मि॰से॰ के हिसाब से मापा गया है.

इस ग्राफ़ पर मौजूद हर बिंदु एक अनुरोध है, जिसके लिए आप टाइमस्टैंप, एचटीटीपी तरीके और स्थिति, उसके लेबल, उससे जुड़ी लॉग एंट्री पर वापस जाने वाले लिंक, और फ़ंक्शन के बाद होने वाले किसी भी आरपीसी कॉल के बारे में ज़्यादा जानकारी देख सकते हैं :

अगर आप'ज़ूम इन करना चाहते हैं, तो बस ग्राफ़ पर क्लिक करें और खींचें :ट्रेस ग्राफ़ में कस्टम समय सीमा चुनना

ज़ूम आउट करने के लिए, पेज के सबसे ऊपर दिए गए &कोटेशन;ज़ूम करें और कोटेशन को पहले जैसा करें बटन पर क्लिक करें.

हमने एक # फ़ंक्शन लागू किया है, इसलिए ग्राफ़ hello-monitor यूआरआई पर सिर्फ़ GET अनुरोध दिखाता है. हालांकि, ट्रेस को एचटीटीपी तरीके (GET, POST, DELETE, ...), एचटीटीपी की स्थिति (GETXX, 3XX, ...) या अनुरोध फ़िल्टर का इस्तेमाल करके फ़िल्टर किया जा सकता है.

बाएं मेन्यू में, ट्रेस और खास जानकारी वाले कोटेशन सेक्शन पर जाएं :

इस खास जानकारी देने वाले पेज से, आप हाल ही में ट्रेस की गई जानकारी और अन्य अहम जानकारी देख सकते हैं.

... साथ ही, यूआरआई अनुरोध के फ़िल्टर, एचटीटीपी तरीके, एचटीटीपी स्टेटस, और समयसीमा के आधार पर कस्टम रिपोर्ट बनाई जा सकती हैं. आप इसकी मदद से जनरेट किए गए मानों की तुलना टाइम बेसलाइन से कर सकते हैं :

अगर आप सही समय सीमा और ज़रूरत के मुताबिक डेटा पॉइंट सेट अप करने का प्रबंधन करते हैं, तो आप एक ऐसी रिपोर्ट बना सकते हैं जो शुरुआती फ़ंक्शन और नए के बीच के इंतज़ार के समय को दिखाती है :

इस तरह की कस्टम रिपोर्ट का इस्तेमाल, यह पता करने के लिए किया जा सकता है कि परफ़ॉर्मेंस की समस्या कब शुरू हुई थी. साथ ही, सेवा के लेवल पर दिखने वाले संकेत (एसएलआई) को भी ट्रैक किया जा सकता है. जैसे, असली उपयोगकर्ता के अनुरोध के इंतज़ार का समय.

यह हमारे कोडलैब की शुरुआत करता है, जिसने एक नए क्लाउड फ़ंक्शन को डिप्लॉय किया. साथ ही, उसके लॉग में नेविगेट करने और उसके अनुरोध ट्रेस को देखने के बारे में बताया.

क्लाउड फ़ंक्शन और स्टैकड्राइवर टूल, बिना सर्वर वाले प्लैटफ़ॉर्म हैं. इनका इस्तेमाल नहीं करने पर, इन खातों के इस्तेमाल पर कोई शुल्क नहीं लिया जाता है. हालांकि, इनकी मदद से एक अच्छा क्लाउड नागरिक ही हमारा काम मिटा सकता है.

बस, क्लाउड फ़ंक्शन की खास जानकारी देने वाले पेज में hello-monitor फ़ंक्शन चुनें और &कोटेशन;मिटाएं&कोट करें; पर क्लिक करें.

यह क्लाउड फ़ंक्शन लॉग इन और ट्रेस के साथ इस आसान कोडलैब (कोड बनाना सीखना) को खत्म करने का काम करता है!

यहां कुछ फ़ॉलो-अप रीडिंग दी गई है :

/