অ্যান্টিপ্যাটার্ন: API প্রক্সিতে একাধিকবার MessageLogging নীতি প্রয়োগ করা

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন দেখুন।
তথ্য

Apigee Edge-এর MessageLogging নীতি API Proxy ডেভেলপারদের কাস্টম মেসেজ লগ করতে দেয় syslog বা ডিস্কে (শুধুমাত্র প্রাইভেট ক্লাউডের জন্য Edge)। API অনুরোধ সম্পর্কিত ইনপুট প্যারামিটার, অনুরোধের পেলোড, রেসপন্স কোড, সমস্যার মেসেজ (যদি থাকে), ইত্যাদির মতো যেকোনও গুরুত্বপূর্ণ তথ্য পরে রেফারেন্স বা ডিবাগিংয়ের জন্য লগ করা যেতে পারে। নীতিটি লগ করার জন্য একটি ব্যাকগ্রাউন্ড প্রসেস ব্যবহার করলেও, নীতিটি ব্যবহার করার ক্ষেত্রে কিছু সীমাবদ্ধতা আছে।

অ্যান্টিপ্যাটার্ন

MessageLogging নীতি API অনুরোধ সম্পর্কে আরও তথ্য পেতে এবং API অনুরোধের সাথে হওয়া যেকোনও সমস্যার সমাধান করতে একটি কার্যকর উপায় প্রদান করে। তবে, একই MessageLogging নীতি একাধিকবার ব্যবহার করলে অথবা একাধিক MessageLogging নীতি থাকলে, PostClientFlow ছাড়া অন্য ফ্লোতে একই API প্রক্সি ডেটা লগ করে। এর ফলে সমস্যা হতে পারে। এর কারণ হল, Apigee Edge একটি MessageLogging নীতির জন্য একটি এক্সটার্নাল syslog সার্ভারের সাথে কানেকশন খোলে। নীতিতে TCP-র পরিবর্তে TLS ব্যবহার করা হলে, TLS কানেকশন স্থাপন করার জন্য অতিরিক্ত ওভারহেড থাকে।

আসুন, একটি API প্রক্সির উদাহরণ দিয়ে এটি ব্যাখ্যা করা যাক।

API প্রক্সি

নিচের উদাহরণে, "LogRequestInfo" নামের একটি MessageLogging নীতি অনুরোধ ফ্লোতে রাখা হয়েছে এবং "LogResponseInfo" নামের আরেকটি MessageLogging নীতি উত্তর ফ্লোতে যোগ করা হয়েছে। দুটিই ProxyEndpoint PreFlow-তে আছে। API প্রক্সি অনুরোধ পাওয়ার সাথে সাথেই LogRequestInfo নীতি ব্যাকগ্রাউন্ডে এক্সিকিউট হয় এবং প্রক্সি টার্গেট সার্ভার থেকে উত্তর পাওয়ার পরে কিন্তু API ক্লায়েন্টকে উত্তর পাঠানোর আগে LogResponseInfo নীতি এক্সিকিউট হয়। এর ফলে দুটি TLS কানেকশন সম্ভাব্যভাবে তৈরি হওয়ার কারণে অতিরিক্ত সিস্টেম রিসোর্স ব্যবহার হবে।

এছাড়াও, "LogErrorInfo" নামের একটি MessageLogging নীতি আছে যা শুধুমাত্র API প্রক্সি এক্সিকিউশনের সময় কোনও সমস্যা হলে এক্সিকিউট করা হয়।

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
  ...
<FaultRules>
    <FaultRule name="fault-logging">
        <Step>
            <Name>LogErrorInfo</Name>
        </Step>
    </FaultRule>
</FaultRules>
<PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>LogRequestInfo</Name>
      </Step>
    </Request>
  </PreFlow>
  <PreFlow name="PreFlow">
    <Response>
      <Step>
        <Name>LogResponseInfo</Name>
      </Step>
    </Response>
  </PreFlow>
  ...
</ProxyEndpoint>

মেসেজ লগ করা সংক্রান্ত নীতি

নিম্নলিখিত উদাহরণ নীতি কনফিগারেশনে, TCP-র মাধ্যমে TLS ব্যবহার করে থার্ড-পার্টি লগ সার্ভারে ডেটা লগ করা হচ্ছে। একই API প্রক্সিতে এইসব নীতির মধ্যে একাধিক নীতি ব্যবহার করা হলে, TLS কানেকশন স্থাপন ও ম্যানেজ করার ওভারহেড অতিরিক্ত সিস্টেম মেমরি ও CPU সাইকেল দখল করবে, যার ফলে বড় স্কেলে পারফর্ম্যান্স সংক্রান্ত সমস্যা হবে।

LogRequestInfo নীতি

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogRequestInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {request.queryparam.w}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

LogResponseInfo নীতি

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogResponseInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Status: {response.status.code}, Response {response.content}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

LogErrorInfo নীতি

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogErrorInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Fault name: {fault.name}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>ERROR</logLevel>
</MessageLogging>

প্রভাব

  • API প্রক্সি ফ্লো চলাকালীন একাধিকবার লগ সার্ভারের সাথে কানেকশন স্থাপন করার কারণে নেটওয়ার্কিং ওভারহেড বেড়ে যায়।
  • সিসলগ সার্ভার ধীরে কাজ করলে বা একাধিক সিসলগ কলের কারণে হওয়া বেশি ভলিউম সামলাতে না পারলে, মেসেজ প্রসেসরের উপর ব্যাক প্রেসার পড়বে, যার ফলে অনুরোধ প্রসেস করতে দেরি হবে এবং সম্ভাব্য হাই লেটেন্সি বা ৫০৪ গেটওয়ে টাইমআউট সংক্রান্ত সমস্যা হবে।
  • ফাইল লগিং ব্যবহার করা হয় এমন প্রাইভেট ক্লাউড সেট-আপে মেসেজ প্রসেসর দ্বারা খোলা কনকারেন্ট ফাইল ডেসক্রিপ্টরের সংখ্যা বৃদ্ধি।
  • MessageLogging নীতিটি PostClient ফ্লো ছাড়া অন্য কোনও ফ্লোতে প্লেস করা হলে, এমন সম্ভাবনা থাকে যে তথ্য লগ করা নাও হতে পারে, কারণ এই নীতিটি কার্যকর করার আগে কোনও সমস্যা হলে MessageLogging নীতিটি আর কার্যকর করা হবে না।

    আগের ProxyEndpoint উদাহরণে, নিম্নলিখিত পরিস্থিতিতে তথ্য লগ করা হবে না:

    • অনুরোধ ফ্লোতে LogRequestInfo নীতির আগে থাকা কোনও নীতি কাজ না করলে।
      অথবা
    • টার্গেট সার্ভারে কোনও সমস্যা হলে (HTTP 4XX, 5XX)। এই পরিস্থিতিতে, কোনও সফল উত্তর না পেলে, LogResponseInfo নীতি এক্সিকিউট করা হবে না।

    দুটি ক্ষেত্রেই, LogErrorInfo নীতি এক্সিকিউট করা হবে এবং শুধুমাত্র সমস্যা সম্পর্কিত তথ্য লগ করা হবে।

পেশাদার পদ্ধতি

  • লগ করতে হবে এমন সব ফ্লো ভেরিয়েবল সেট করতে ExtractVariables নীতি বা JavaScript নীতি ব্যবহার করুন, এর ফলে সেগুলি MessageLogging নীতির জন্য উপলভ্য হবে।
  • PostClientFlow-তে প্রয়োজনীয় সব ডেটা লগ করার জন্য একটি MessageLogging নীতি ব্যবহার করুন, যা শর্তসাপেক্ষ নয়।
  • UDP প্রোটোকল ব্যবহার করুন, যেখানে syslog সার্ভারে মেসেজ ডেলিভার করার গ্যারান্টি প্রয়োজন নেই এবং TLS/SSL বাধ্যতামূলক নয়।

MessageLogging নীতিটি প্রকৃত API ফাংশনালিটি থেকে আলাদা করে ডিজাইন করা হয়েছে, যার মধ্যে সমস্যা সমাধান অন্তর্ভুক্ত। তাই, PostClientFlow-তে এটি ইনভোক করা হয়, যা অনুরোধ/উত্তর প্রসেসিংয়ের বাইরে থাকে। এর অর্থ হল, API ব্যর্থ হোক বা না হোক, এটি সবসময় ডেটা লগ করবে।

PostClientFlow-তে MessageLogging নীতি প্রয়োগ করার একটি উদাহরণ এখানে দেওয়া হল:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 ...
<PostClientFlow>
        <Request/>
        <Response>
            <Step>
                <Name>LogInfo</Name>
            </Step>
        </Response>
</PostClientFlow>
 ...

এখানে MessageLogging নীতির একটি উদাহরণ দেওয়া হল, LogInfo, যা সব ডেটা লগ করে:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MessageLogging name="LogInfo">
  <Syslog>
    <Message>[3f509b58 tag="{organization.name}.{apiproxy.name}.{environment.name}"] Weather request for WOEID {woeid} Status: {weather.response.code}, Response {weather.response}, Fault: {fault.name:None}.</Message>
    <Host>logs-01.loggly.com</Host>
    <Port>6514</Port>
    <Protocol>TCP</Protocol>
    <FormatMessage>true</FormatMessage>
    <SSLInfo>
        <Enabled>true</Enabled>
    </SSLInfo>
  </Syslog>
  <logLevel>INFO</logLevel>
</MessageLogging>

কারণ, কোনও সমস্যার ফ্লো অনুসরণ করার পরে PostClientFlow-তে উত্তর ভেরিয়েবল উপলভ্য থাকে না, তাই ExtractVariables বা JavaScript নীতি ব্যবহার করে woeid এবং weather.response* ভেরিয়েবল স্পষ্টভাবে সেট করা গুরুত্বপূর্ণ।

আরও পড়ুন