অ্যান্টিপ্যাটার্ন: একটি API প্রক্সিতে একাধিকবার মেসেজলগিং নীতি চালু করুন

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

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

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

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

একটি উদাহরণ API প্রক্সির সাহায্যে এটি ব্যাখ্যা করা যাক।

API প্রক্সি

নিম্নলিখিত উদাহরণে, "LogRequestInfo" নামে একটি MessageLogging নীতি অনুরোধের প্রবাহে স্থাপন করা হয়েছে এবং "LogResponseInfo" নামে আরেকটি MessageLogging নীতি প্রতিক্রিয়া প্রবাহে যোগ করা হয়েছে। উভয়ই প্রক্সিএন্ডপয়েন্ট প্রিফ্লোতে রয়েছে। 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>

বার্তা লগিং নীতি

নিম্নলিখিত উদাহরণ নীতি কনফিগারেশনে, ডেটা টিসিপির উপর 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 প্রক্সি ফ্লো চলাকালীন লগ সার্ভারের সাথে একাধিকবার সংযোগ স্থাপনের কারণে নেটওয়ার্কিং ওভারহেড বেড়েছে।
  • যদি syslog সার্ভার ধীর হয় বা একাধিক syslog কলের কারণে উচ্চ ভলিউম পরিচালনা করতে না পারে, তাহলে এটি বার্তা প্রসেসরের উপর চাপ সৃষ্টি করবে, যার ফলে ধীর অনুরোধ প্রক্রিয়াকরণ এবং সম্ভাব্য উচ্চ বিলম্ব বা 504 গেটওয়ে টাইমআউট ত্রুটি দেখা দেবে।
  • ব্যক্তিগত ক্লাউড সেটআপে যেখানে ফাইল লগিং ব্যবহার করা হয় সেখানে বার্তা প্রসেসর দ্বারা খোলা সমসাময়িক ফাইল বর্ণনাকারীর সংখ্যা বৃদ্ধি পেয়েছে।
  • যদি MessageLogging নীতিটি PostClient ফ্লো ব্যতীত অন্য ফ্লোতে রাখা হয়, তাহলে একটি সম্ভাবনা আছে যে তথ্যটি লগ করা নাও হতে পারে, কারণ এই নীতিটি কার্যকর করার আগে কোনো ব্যর্থতা ঘটলে MessageLogging নীতি কার্যকর করা হবে না৷

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

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

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

ভাল অভ্যাস

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

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

পোস্টক্লায়েন্টফ্লোতে মেসেজলগিং নীতি আহ্বান করার একটি উদাহরণ এখানে রয়েছে:

<?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* ভেরিয়েবলগুলি স্পষ্টভাবে সেট করা গুরুত্বপূর্ণ৷

আরও পড়া