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

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

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

ลายป้องกัน

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

เราจะอธิบายเรื่องนี้โดยใช้ตัวอย่างพร็อกซี API

พร็อกซี API

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

นอกจากนี้ ยังมีนโยบาย MessageLoking ชื่อ "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 ที่ใช้การบันทึกไฟล์
  • หากวางนโยบาย MessageLoking ไว้ในขั้นตอนอื่นที่ไม่ใช่โฟลว์ PostClient ระบบอาจไม่บันทึกข้อมูลนั้น เนื่องจากนโยบาย MessageLoking จะไม่มีการนำมาใช้หากการดำเนินการล้มเหลวก่อนการใช้นโยบายนี้

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

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

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

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

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

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

ต่อไปนี้เป็นตัวอย่างการเรียกใช้นโยบาย MessageLoking ใน PostClientFlow:

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

ด้านล่างนี้เป็นตัวอย่างของนโยบาย MessageLoking หรือ 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* อย่างชัดเจนโดยใช้นโยบาย ExtractVariable หรือ JavaScript

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