Antipattern: เรียกใช้นโยบาย MessageLoking หลายครั้งในพร็อกซี API

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

นโยบาย MessageLogging ของ Apigee Edge ช่วยให้นักพัฒนาแอปพร็อกซี API บันทึกข้อความที่กำหนดเองลงใน syslog หรือดิสก์ (Edge for Private Cloud เท่านั้น) ระบบสามารถบันทึกข้อมูลสำคัญที่เกี่ยวข้องกับคำขอ API เช่น พารามิเตอร์อินพุต เพย์โหลดของคำขอ โค้ดตอบกลับ ข้อความแสดงข้อผิดพลาด (หากมี) และอื่นๆ เพื่อใช้อ้างอิงในภายหลังหรือเพื่อการแก้ไขข้อบกพร่อง แม้ว่านโยบายจะใช้กระบวนการเบื้องหลังเพื่อทำการบันทึก แต่ก็มีข้อควรระวังในการใช้นโยบายนี้

รูปแบบที่ไม่แนะนำ

นโยบาย MessageLogging เป็นวิธีที่มีประสิทธิภาพในการรับข้อมูลเพิ่มเติมเกี่ยวกับคำขอ API และการแก้ไขข้อบกพร่องของปัญหาที่พบในคำขอ API อย่างไรก็ตาม การใช้นโยบาย MessageLogging เดียวกันมากกว่า 1 ครั้ง หรือการมีนโยบาย MessageLogging หลายรายการที่บันทึกข้อมูลเป็นกลุ่มในพร็อกซี API เดียวกันในโฟลว์อื่นที่ไม่ใช่ PostClientFlow อาจส่งผลเสียได้ เนื่องจาก Apigee Edge จะเปิดการเชื่อมต่อ กับเซิร์ฟเวอร์ syslog ภายนอกสำหรับนโยบาย MessageLogging หากนโยบายใช้ TLS ผ่าน TCP ก็จะมีค่าใช้จ่ายเพิ่มเติมในการสร้างการเชื่อมต่อ TLS

มาอธิบายเรื่องนี้ด้วยความช่วยเหลือจากพร็อกซี API ตัวอย่างกัน

พร็อกซี API

ในตัวอย่างต่อไปนี้ นโยบาย MessageLogging ชื่อ "LogRequestInfo" จะอยู่ใน โฟลว์คำขอ และนโยบาย MessageLogging อีกรายการชื่อ "LogResponseInfo" จะเพิ่มลงใน โฟลว์การตอบกลับ ทั้ง 2 รายการอยู่ใน ProxyEndpoint PreFlow นโยบาย LogRequestInfo จะทำงาน ในเบื้องหลังทันทีที่พร็อกซี API ได้รับคำขอ และนโยบาย LogResponseInfo จะทำงาน หลังจาก ที่พร็อกซีได้รับการตอบกลับจากเซิร์ฟเวอร์เป้าหมายแล้ว แต่ ก่อน ที่พร็อกซีจะส่งการตอบกลับไปยังไคลเอ็นต์ API การดำเนินการนี้จะใช้ ทรัพยากรระบบเพิ่มเติมเนื่องจากอาจมีการสร้างการเชื่อมต่อ TLS 2 รายการ

นอกจากนี้ ยังมีนโยบาย MessageLogging ชื่อ "LogErrorInfo" ซึ่งจะทำงานก็ต่อเมื่อเกิดข้อผิดพลาดระหว่างการทำงานของพร็อกซี 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 ผ่าน TCP หากมีการใช้นโยบายเหล่านี้มากกว่า 1 รายการในพร็อกซี 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
  • จำนวนตัวอธิบายไฟล์ที่เปิดพร้อมกันเพิ่มขึ้นโดยตัวประมวลผลข้อความในการตั้งค่า Private Cloud ที่ใช้การบันทึกไฟล์
  • หากวางนโยบาย MessageLogging ไว้ในโฟลว์อื่นที่ไม่ใช่โฟลว์ PostClient ก็อาจมีการบันทึกข้อมูลไม่สำเร็จ เนื่องจากนโยบาย MessageLogging จะไม่ทำงานหากเกิดข้อผิดพลาดก่อนการทำงานของนโยบายนี้

    ในตัวอย่าง ProxyEndpoint ก่อนหน้านี้ ระบบจะไม่บันทึกข้อมูลในกรณีต่อไปนี้

    • หากนโยบายใดก็ตามที่วางไว้ก่อนนโยบาย LogRequestInfo ใน โฟลว์คำขอทำงานไม่สำเร็จ
      หรือ
    • หากเซิร์ฟเวอร์เป้าหมายทำงานไม่สำเร็จโดยเกิดข้อผิดพลาด (HTTP 4XX, 5XX) ในกรณีนี้ เมื่อระบบไม่ส่งการตอบกลับที่สำเร็จ นโยบาย LogResponseInfo จะไม่ทำงาน

    ในทั้ง 2 กรณี นโยบาย LogErrorInfo จะทำงานและบันทึกเฉพาะข้อมูลที่เกี่ยวข้องกับข้อผิดพลาด

แนวทางปฏิบัติแนะนำ

  • ใช้นโยบาย ExtractVariables หรือนโยบาย JavaScript เพื่อตั้งค่าตัวแปรโฟลว์ทั้งหมด ที่จะบันทึก ทำให้ตัวแปรเหล่านั้นพร้อมใช้งานสำหรับนโยบาย MessageLogging
  • ใช้นโยบาย MessageLogging รายการเดียวเพื่อบันทึกข้อมูลที่จำเป็นทั้งหมดใน PostClientFlow, ซึ่งจะทำงานโดยไม่มีเงื่อนไข
  • ใช้โปรโตคอล UDP ในกรณีที่ไม่จำเป็นต้องมีการรับประกันการส่งข้อความไปยังเซิร์ฟเวอร์ syslog และ TLS/SSL ไม่ใช่ข้อบังคับ

นโยบาย MessageLogging ได้รับการออกแบบมาให้แยกออกจากฟังก์ชันการทำงานของ API จริง ซึ่งรวมถึงการจัดการข้อผิดพลาด ดังนั้น การเรียกใช้นโยบายใน PostClientFlow ซึ่งอยู่นอก การประมวลผลคำขอ/การตอบกลับ หมายความว่านโยบายจะบันทึกข้อมูลเสมอไม่ว่า API จะทำงานไม่สำเร็จหรือไม่ก็ตาม

ต่อไปนี้คือตัวอย่างการเรียกใช้นโยบาย MessageLogging ใน PostClientFlow

<?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 หลังจากโฟลว์ข้อผิดพลาด จึง ควรตั้งค่า woeid และ weather.response* ตัวแปรอย่างชัดเจนโดยใช้ นโยบาย ExtractVariables หรือ JavaScript

อ่านเพิ่มเติม