قابلیت مشاهده‌ پذیری (observability) در WSO2

مشاهده­پذیری را می­توان به عنوان یک مجموعه قابلیت در حوزه‌ی نظارت بر عملکرد سیستم در نظر گرفت که در آن نظارت با قابلیت­هایی برای انجام اشکال­زدایی و نمایه­سازی از طریق تجزیه و تحلیل لاگ، همبستگی و ردیابی پیشرفته ارائه می‌شود. مشاهده‌پذیری مدرن امروزی بر سه پایه‌ی logs (لاگ‌ها یا گزارشات)، metrics (معیارها) و tracing (ردیابی) استوار است. کسب‌وکارهای مدرن به سیستم‌های مشاهده‌پذیری نیاز دارند تا به‌طور خودکفایی وضعیت فعلی خود را منتشر کنند، هشدارهایی را برای هر گونه ناهنجاری شناسایی شده برای شناسایی فعالانه خرابی‌ها نمایش داده و اطلاعاتی برای یافتن دلایل بروز  خطا ارائه کنند. در ادامه این مطلب با شرکت دانش بنیان پلتکو همراه باشید.

Logs (لاگ ها یا گزارشات)

Correlation Logs (لاگ‌های مربوط به همبستگی)

قابلیت مشاهده در WSO2 API Manager (WSO2 API-M) برای اشکال­زدایی مسائل در یک دوره کوتاه بسیار مهم است. WSO2 API-M با ثبت نکات مهم زیر از سیستم با زمان صرف­شده برای دستیابی به آنها، مشاهده را تسهیل می‌کند.

  • Method Calls (فراخوانی‌های متد)
  • External Calls (HTTP/HTTPS) (فراخوانی‌های خارجی)
  • Database Calls (JDBC and LDAP) (فراخوانی‌های پایگاه داده)

علاوه بر این، هنگامی که قابلیت مشاهده در WSO2 API-M فعال است، یک Correlation ID (شناسه همبستگی) تصادفی در WSO2 API-M برای هر تراکنش ایجاد می‌شود که به شما امکان می‌دهد سه نوع فراخوانی آخر را به هم مرتبط کنید.

بنابراین، درخواست‌ها و پاسخ‌هایی که با یک فراخوانی API خاص مطابقت دارند، در یک شناسه همبستگی ثبت می‌شوند که تجزیه و تحلیل اطلاعات را آسان‌تر می‌کند. در صورت نیاز، می‌توانید با افزودن activityid  در header درخواست ارسال شده به WSO2 API-M، یک شناسه همبستگی منحصر به فرد ارائه دهید.

 

توجه

      قابلیت مشاهده‌پذیری به‌طور پیش‌فرض فعال نیست، زیرا کمی بر پرفورمنس API Manager  تأثیر می‌گذارد.

Enabling Correlation Logs (فعال کردن لاگ­های همبستگی)

فعال کردن قابلیت مشاهده در API Manager ساده است. تنها کاری که باید انجام دهید این است که property (ویژگی) سیستم زیر را در اسکریپت راه اندازی محصول (ذخیره شده در مسیر <API-M_HOME>/bin/)   پیدا کنید و آن را روی true تنظیم کنید. به طور پیش فرض، این روی false تنظیم شده است.

-DenableCorrelationLogs=true

نکته

همچنین، می توانید مشاهده پذیری را در زمان راه اندازی سرور WSO2 API-M به صورت زیر فعال کنید:

Linux/Mac OS

sh api-manager.sh -DenableCorrelationLogs=true start

Windows

api-manager.bat –run -DenableCorrelationLogs=true start

توجه

وقتی قابلیت مشاهده در WSO2 API Manager فعال است، یک فایل لاگ جداگانه به نام correlation.log در فهرست <API-M_HOME>/repository ایجاد می‌شود.

External Calls (فراخوانی‌های خارجی)

می‌توانید لاگ‌های همبستگی را در WSO2 API-M فعال کنید تا مسیر رفت و برگشت کامل یک پیام HTTP را ردیابی کنید. این به معنای نظارت بر درخواست‌های HTTP از نقطه‌ای است که یک پیام توسط WSO2 API-M دریافت می‌شود تا زمانی که پیام پاسخ مربوطه به فرستنده پیام اصلی بازگردانده شود (client → API-M → back-end → API-M → client ).

External call logs with API-M specific information
(لاگ فراخوانی‌های خارجی با اطلاعات خاص API-M)

تمام فراخوانی‌های خارجی انجام شده توسط Manager API از طریق این دسته ثبت می‌شود. توجه داشته باشید که این شامل فراخوانی‌های DB نمی‌شود.

این کار از طریق یک Synapse Global Handler انجام می‌شود که اطلاعات مهم فراخوانی‌های خارجی را ثبت می‌کند. فرمت ورودی لاگ فراخوانی خارجی در سطح کنترل کننده جهانی Synapse به شرح زیر است:

قالب

timestamp | CorrelationID | threadName | duration(BE latency) | callType | apiName | apiMethod | apiContext | apiResourcePath | authHeader | orgIdHeader | SrcIdHeader | applIdHeader | uuIdHeader | requestSize | responseSize | apiResponseStatusCode | applicationName | consumerKey | responseTime

 

مثال

2021-11-28` `10:10:56,316|a783f7c3-647f-4d10-9b72-106faa01bba8|PassThroughMessageProcessor-4|20|HTTP|admin–PizzaShackAPI:v1.0.0|GET|/pizzashack/1.0.0/menu|pizzashack/1.0.0/menu|null|null|null|null|null|71|2238|200|DefaultApplication|AwlPOz2aDf2i1gZFWgITEgf4oPsa|21

فیلد

توضیحات

timestamp

زمانی که لاگ ایجاد می‌شود.

مثال: 2021-11-28 10:10:56,293

correlationID

هر لاگ حاوی یک شناسه همبستگی است که منحصر به درخواست HTTP است. یک کلاینت می‌تواند یک شناسه همبستگی منحصر به فرد را در هدر activityID  درخواست HTTP ارسال کند. اگر این شناسه همبستگی در درخواست ورودی وجود نداشته باشد، WSO2 API-M یک شناسه همبستگی تصادفی برای درخواست ایجاد می‌کند.

مثال: a783f7c3-647f-4d10-9b72-106faa01bba8

threadName

شناسه ریسمان

مثال: PassThroughMessageProcessor-4

Duration
 (BE Latency)

فاصله زمانی (بر حسب میلی ثانیه) بین دو حالت پیام.

مثال: 0

callType

HTTP – نوع فراخوانی، لاگ‌هایی را شناسایی می‌کند که با وضعیت تأخیر پشتیبان یا وضعیت تأخیر رفت و برگشت مطابقت دارند. بنابراین، در صورت درخواست فردی، یک لاگ برای شناسایی تأخیر بک‌اند و لاگ دیگری برای تأخیر رفت و برگشت ثبت می‌شود. این لاگ‌ها با استفاده از نوع فراخونی HTTP دسته‌بندی می‌شوند، زیرا این لاگ‌ها به فراخوانی‌های HTTP بین WSO2 API-M و کلاینت‌های خارجی مربوط می‌شوند.

apiName

نام کلاس متدی که فراخوانی شد.

مثال: admin–PizzaShackAPI:v1.0.0

apiMethod

نام متدی که فراخوانی شد.

مثال: GET

apiContext

زمینه API که فراخوانی شد.

apiResourcePath

مسیر منبع API که فراخوانی شد.

مثال: /pizzashack/1.0.0/menu

authHeader

هدر Authorization (احراز هویت) را ثبت می‌کند.

orgIdHeader

هدر organization-id (شناسه سازمان) را ثبت می‌کند.

SrcIdHeader

هدر source-id (شناسه منبع) را ثبت می‌کند.

applIdHeader

هدر application-id (شناسه برنامه) را ثبت می‌کند.

uuIdHeader

هدر uuid  را ثبت می‌کند.

requestSize

اندازه payload (محموله) درخواست

مثال: 71

responseSize

اندازه payload (محموله) پاسخ

مثال: 2238

apiResponseStatusCode

کد وضعیت پاسخ

مثال: 200

applicationName

نام برنامه ای که برای اشتراک در API استفاده شده است.

مثال: DefaultApplication

consumerKey

این به کلید مصرف کننده ای اشاره دارد که هنگام تولید کلید برای محیط های production و sandbox خود دریافت می‌کنید.

مثال: AwlPOz2aDf2i1gZFWgITEgf4oPsa

responseTime

زمان رفت و برگشت درخواست

مثال: 21

Database Call logs (لاگ‌های فراخوانی‌ پایگاه داده)

ثبت فراخوانی­های پایگاه­داده برای مشاهده­پذیری شامل دو نوع فراخوانی DB، یعنی فراخوانی­های LDAP و فراخوانی­های JDBC است. این به ردیابی تاخیرهای ناشی از فراخوانی پایگاه­داده در یک نمونه کمک می‌کند.

 JDBC call logs (لاگ­های فراخوانی JDBC)

قالب

timestamp | correlationID | threadID | duration | callType | startTime | methodName | query | connectionUrl

مثال

2021-11-28` `10:10:43,202|a783f7c3-647f-4d10-9b72-106faa01bba8|PassThroughMessageProcessor-1|0|jdbc|1543380043202|executeQuery|SELECT REG_NAME, REG_VALUE FROM REG_PROPERTY P, REG_RESOURCE_PROPERTY RP WHERE P.REG_ID=RP.REG_PROPERTY_ID AND RP.REG_VERSION=? AND P.REG_TENANT_ID=RP.REG_TENANT_ID AND RP.REG_TENANT_ID=?|jdbc:h2:repository/database/WSO2CARBON_DB

فیلد

توضیحات

timestamp زمانی که لاگ ایجاد می‌شود.

مثال: 2021-11-28 10:10:43,202

correlationID هر لاگ حاوی یک شناسه همبستگی است که منحصر به درخواست HTTP است. یک کلاینت می‌تواند یک شناسه همبستگی منحصر به فرد را در هدر activityID  درخواست HTTP ارسال کند. اگر این شناسه همبستگی در درخواست ورودی وجود نداشته باشد، WSO2 API-M یک شناسه همبستگی تصادفی برای درخواست ایجاد می‌کند.

مثال: a783f7c3-647f-4d10-9b72-106faa01bba8

threadName شناسه ریسمان

مثال: PassThroughMessageProcessor-1

duration فاصله زمانی (بر حسب میلی ثانیه) بین دو حالت پیام.

مثال: 0

callType jdbc – این نشان دهنده لاگ‌های سطح JDBC است
startTime زمان شروع کوئری بر حسب میلی ثانیه.

مثال: 1543380043202

methodName نوع متد statement SQL که فراخوانی شده.

مثال: executeQuery

query SQL query.

مثال:

SELECT REG_NAME, REG_VALUE FROM REG_PROPERTY P, REG_RESOURCE_PROPERTY RP WHERE P.REG_ID=RP.REG_PROPERTY_ID AND RP.REG_VERSION=? AND P.REG_TENANT_ID=RP.REG_TENANT_ID AND RP.REG_TENANT_ID=?

connectionUrl URL اتصال پایگاه داده.

مثال: jdbc:h2:repository/database/WSO2CARBON_DB

LDAP call logs (لاگ‌های فراخوانی LDAP)

قالب

timestamp | correlationID | threadID | duration | callType | startTime | methodName | providerUrl | principal | argsLengeth | args

مثال

2021-11-0514:05:18,599|86b56b19-7872-4e2f-84f3-5a14f92e18c1|http-nio-9443-exec-8|200|ldap|1541406918591|search|ldap://localhost:10389|uid=admin,ou=system|3|

uid=admin,ou=Users,dc=WSO2,dc=ORG,(&(objectClass=person)(uid=admin)),javax.naming.directory.SearchControls@548e9a48

فیلد

توضیحات

timestamp

زمانی که لاگ ایجاد می‌شود.

مثال: 2021-11-0514:05:18,599

correlationID

هر لاگ حاوی یک شناسه همبستگی است که منحصر به درخواست HTTP است. یک کلاینت می‌تواند یک شناسه همبستگی منحصر به فرد را در هدر activityID  درخواست HTTP ارسال کند. اگر این شناسه همبستگی در درخواست ورودی وجود نداشته باشد، WSO2 API-M یک شناسه همبستگی تصادفی برای درخواست ایجاد می‌کند.

مثال: a783f7c3-647f-4d10-9b72-106faa01bba8

threadName

شناسه ریسمان

مثال: http-nio-9443-exec-8

duration

فاصله زمانی (بر حسب میلی ثانیه) بین دو حالت پیام.

مثال: 200

callType

ldap – لاگ‌های سطح LDAP را تعیین می‌کند.

startTime

زمان شروع کوئری بر حسب میلی ثانیه.

مثال: 1541406918591

methodName

نوع متد LDAP که فراخوانی شده.

مثال: search

providerUrl

URL اتصال LDAP.

مثال: ldap://localhost:10389

principal

نام ورود کاربر.

مثال: uid=admin,ou=system

argsLength

طول استدلال.

مثال: 3

args

آرگومان ها در کوئری LDAP.

مثال:

uid=admin,ou=Users,dc=WSO2,dc=ORG,(&(objectClass=person)(uid=admin))

,javax.naming.directory.SearchControls@548e9a48

استفاده از لاگ‌های همبستگی برای ردیابی یک درخواست خاص

دستورالعمل‌های زیر را دنبال کنید تا لاگ‌های همبستگی یک درخواست ارسال شده خاص را بررسی کنید:

مرحله 1 – راه اندازی WSO2 API-M

قابلیت مشاهده با WSO2 API-M را فعال کنید و سرور WSO2 API-M را همانطور که در بالا توضیح داده شد راه اندازی کنید.

مرحله 2 – فراخوانی یک API

برای فراخوانی API از دستور زیر استفاده کنید.

curl -k “Authorization :Bearer <access-token>” -H “activityid:<example-correlation-ID>” –data “<payload>” <api_url>

توجه

اگر curl در دسترس نیست، می‌توانید از هر ابزاری برای فراخوانی API استفاده کنید. اما مطمئن شوید که هدر activityid را اضافه کنید

مرحله 3 – بررسی لاگ‌های Correlation
  1. یک ترمینال را باز کنید و به دایرکتوری <API-M_HOME>/repository/logs بروید که در آن فایلlog ذخیره شده است.
  1. لاگ‌های مرتبط را جدا کنید.
    <correlation_ID> را با <example-correlation-ID> داده شده در بالا جایگزین کنید.
    cat correlation.log | grep “<correlation_ID>”
خواندن و تجزیه و تحلیل لاگ‌های مربوط به همبستگی

بیایید نمونه زیر را تجزیه و تحلیل کنیم.

1 `2021-11-29 15:19:13,859|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|1|HTTP State Transition|http-incoming-2|GET|/testing/1|REQUEST_HEAD`

2 `2021-11-29 15:19:13,859|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|0|HTTP State Transition|http-incoming-2|GET|/testing/1|REQUEST_DONE`

3 `2021-11-29 15:19:13,862|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.CORSRequestHandler|handleRequest|[messageContext]`

4 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.APIKeyValidator|getResourceCache|[]`

5 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.APIKeyValidator|getResourceAuthenticationScheme|[synCtx]`

6 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.AuthenticationContext|getCallerToken|[]`

7 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.oauth.OAuthAuthenticator|authenticate|[synCtx]`

8 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler|handleRequest|[messageContext]`

9 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.throttling.ThrottleHandler|doThrottle|[messageContext]`

10 `2021-11-29 15:19:13,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.analytics.APIMgtUsageHandler|handleRequest|[mc]`

11 `2021-11-29 15:19:13,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.analytics.APIMgtGoogleAnalyticsTrackingHandler|handleRequest|[msgCtx]`

12 `2021-11-29 15:19:13,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler|mediate|[messageContext, direction]`

13 `2021-11-29 15:19:13,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-17|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler|handleRequest|[messageContext]`

14 `2021-11-29 15:19:13,984||pool-10-thread-1|0|jdbc|1543484953984|executeQuery|SELECT REG_PATH, REG_USER_ID, REG_LOGGED_TIME, REG_ACTION, REG_ACTION_DATA FROM REG_LOG WHERE REG_LOGGED_TIME>? AND REG_LOGGED_TIME<? AND REG_TENANT_ID=? ORDER BY REG_LOGGED_TIME DESC|jdbc:h2:repository/database/WSO2CARBON_DB`

15 `2021-11-29 15:19:13,984||pool-10-thread-1|0|jdbc|1543484953984|executeQuery|SELECT UM_ID, UM_DOMAIN_NAME, UM_EMAIL, UM_CREATED_DATE, UM_ACTIVE FROM UM_TENANT ORDER BY UM_ID|jdbc:h2:repository/database/WSO2CARBON_DB`

16 `2021-11-29 15:19:14,031|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Sender I/O dispatcher-3|3|HTTP State Transition|http-outgoing-3|GET|http://0.0.0.0:10080/hello/sayHello|REQUEST_DONE`

17 `2021-11-29 15:19:14,863|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Sender I/O dispatcher-3|832 |HTTP|http://0.0.0.0:10080/hello/sayHello|BACKEND LATENCY`

18 `2021-11-29 15:19:14,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Sender I/O dispatcher-3|832|HTTP State Transition|http-outgoing-3|GET|http://0.0.0.0:10080/hello/sayHello|RESPONSE_HEAD`

19 `2021-11-29 15:19:14,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Sender I/O dispatcher-3|1|HTTP State Transition|http-outgoing-3|GET|http://0.0.0.0:10080/hello/sayHello|RESPONSE_BODY`

20 `2021-11-29 15:19:14,864|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Sender I/O dispatcher-3|0|HTTP State Transition|http-outgoing-3|GET|http://0.0.0.0:10080/hello/sayHello|RESPONSE_DONE`

21 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|1003|HTTP|admin–test:v1|GET|/testing/1/*|testing/1|null|null|null|null|null|71|73|200|DefaultApplication|AwlPOz2aDf2i1gZFWgITEgf4oPsa|1005`

22 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.CORSRequestHandler|handleResponse|[messageContext]`

23 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.security.APIAuthenticationHandler|handleResponse|[messageContext]`

24 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.throttling.ThrottleHandler|handleResponse|[messageContext]`

25 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.analytics.APIMgtUsageHandler|handleResponse|[mc]`

26 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.analytics.APIMgtGoogleAnalyticsTrackingHandler|handleResponse|[arg0]`

27 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler|mediate|[messageContext, direction]`

28 `2021-11-29 15:19:14,868|ff0c8866-d8a8-4189-930d-016b9d92f1e8|PassThroughMessageProcessor-18|0|METHOD|org.wso2.carbon.apimgt.gateway.handlers.ext.APIManagerExtensionHandler|handleResponse|[messageContext]`

29 `2021-11-29 15:19:14,870|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|1011|HTTP State Transition|http-incoming-2|GET|/testing/1|RESPONSE_HEAD`

30 `2021-11-29 15:19:14,871|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|1|HTTP State Transition|http-incoming-2|GET|/testing/1|RESPONSE_BODY`

31 `2021-11-29 15:19:14,871|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|0|HTTP State Transition|http-incoming-2|GET|/testing/1|RESPONSE_DONE`

32 `2021-11-29 15:19:14,871|ff0c8866-d8a8-4189-930d-016b9d92f1e8|HTTP-Listener I/O dispatcher-2|1012|HTTP|http-incoming-2|GET|/testing/1|ROUND-TRIP LATENC

 

`

شماره خط توضیحات
1-2 انتقال وضعیت HTTP هنگام دریافت درخواست
3-13 متدهای فراخوانی شده در کنترل کننده های Gateway در مسیر درخواست
14-15 فراخوانی‌های پایگاه داده بی ربط به تماس API
16 انتقال وضعیت HTTP برای درخواست
17 تاخیر Backend

در اینجا لاگ تأخیر بکند، تأخیر 800 میلی‌ثانیه‌ای را که برای این مثال به باطن اضافه شده بود، منعکس می‌کند.

18-20 انتقال وضعیت HTTP برای پاسخ
21 سطح کنترل کننده جهانی Synapse برای لاگ فراخوانی بکند
22-28 متد‌هایی که در کنترل‌کننده‌های Gateway در مسیر پاسخ فراخوانی شده‌اند
29-31 انتقال وضعیت HTTP برای ارسال پاسخ
32 تأخیر رفت و برگشت HTTP
باریک کردن یک bottleneck  با استفاده از قابلیت مشاهده

سناریو: درخواستی که به Manager API ارسال می‌شود زمان زیادی برای پاسخ دادن نیاز دارد

این ممکن است به دلایل مختلفی رخ دهد،

  1. به دلیل خطای برنامه نویسی
  2. به دلیل زمانبر بودن تماس با سرویس پشتیبان
  3. به دلیل زمانبر بودن تماس با پایگاه داده/LDAP

برای مشخص کردن تنگنا مراحل زیر را دنبال کنید

با استفاده از دستور زیر می توانید زمان های مصرف شده توسط سطح کد را لیست کنید. این به شما کمک می‌کند تا تاخیرهای سطح متد را مشخص کنید.

cat correlation.log | grep “|METHOD|” | cut -d “|” -f4 | sort –n

این زمان صرف شده توسط هر متد را به ترتیب صعودی نشان می‌دهد. اگر متدی با زمان مصرف بالا شناسایی شد،  تماس سرویس و پایگاه داده زمان‌بر را با همان شناسه همبستگی لاگ‌های متد انجام دهید و تماس غیرمعمول زمان‌بر را پیدا کنید.

cat correlation.log | grep “correlationID” | grep “|HTTP” | cut -d “|” -f4 | sort -n

cat correlation.log | grep “correlationID” | grep “|jdbc|” | cut -d “|” -f4 | sort -n

cat correlation.log | grep “correlationID” | grep “|ldap|” | cut -d “|” -f4 | sort -n

توجه

اگر متدی با زمان مصرف زیاد قابل شناسایی نباشد، اما باز هم تاخیر بالایی مشاهده شود، دستور زیر را می توان اجرا کرد تا بالاترین زمان ثبت شده را بیابد.

cat correlation.log | cut -d “|” -f4 | sort -n

سپس با جستجوی فایل برای این زمان، ورودی که دارای بیشترین مدت زمان است را می توان یافت.

cat correlation.log | grep “<highest_time>”

نکته

از سوی دیگر، ابزار تجزیه و تحلیل لاگ نیز می‌تواند برای استخراج این اطلاعات استفاده شود.

HTTP Access Logs (لاگ‌های دسترسی HTTP)

لاگ‌های دسترسی HTTP به شما کمک می‌کنند استفاده از برنامه‌تان را با اطلاعاتی مانند افرادی که به آن دسترسی دارند، تعداد بازدیدهایی که دریافت کرده‌اند، خطاها و غیره نظارت کنید. این اطلاعات برای عیب‌یابی خطاها مفید است.

در API Manager، لاگ‌های دسترسی را می‌توان هم برای انتقال سرور و هم برای انتقال PassThrough یا NIO در API Gateway پیکربندی کرد.

پیکربندی لاگ‌های دسترسی برای انتقال HTTP Servlet

در WSO2 API Manager، لاگ‌های دسترسی را می‌توان برای انتقال سرور HTTP که روی پورت های پیش فرض 9443/9763 کار می کند، تولید کرد. لاگ‌های دسترسی انتقال سرویس HTTP برای تجزیه و تحلیل جزئیات دسترسی در سطح عملیاتی/مدیریتی مفید هستند.

در Manager API، لاگ‌های دسترسی برنامه‌ها در فایل <APIM_HOME>repository/logs/http_access_.log ضبط یا نوشته می‌شوند. پیکربندی زیر مقدار جدیدی را فعال می‌کند که به لاگ‌ها اجازه می‌دهد در <APIM_HOME>repository/logs/wso2carbon.log یا هر فایل لاگ دیگری نوشته شده و در کنسول نمایش داده شوند.

  1. فایل /repository/conf/deployment.toml را باز کنید.
  2. پیکربندی زیر را اضافه کنید.

[http_access_log]

useLogger = true

  1. سرور را مجددا راه اندازی کنید.

در زیر نمونه‌ای از ورودی‌های لاگ دسترسی آمده است که به‌طور پیش‌فرض از طریق فایل

<API-M_HOME>/repository/logs/http_access_.log قابل نظارت است.

– 127.0.0.1 – – [12/Dec/2019:16:53:29 +0530] “POST /token HTTP/1.1” – 125 “-” “-“

– 127.0.0.1  – [12/Dec/2019:16:53:29 +0530] “- – ” 200 – “-” “-“

– 127.0.0.1 – – [12/Dec/2019:16:53:29 +0530] “POST /oauth2/token HTTP/1.1” – – “-” “Synapse-PT-HttpComponents-NIO”

– 127.0.0.1  – [12/Dec/2019:16:53:29 +0530] “- – ” 200 – “-” “-“

– 127.0.0.1 – – [12/Dec/2019:16:54:38 +0530] “OPTIONS /pizzashack/1.0.0/menu HTTP/1.1” – – “https://localhost:9443/devportal/apis/462a90a2-9f2b-423f-9f58-28b95c30a184/test” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36”

– 127.0.0.1  – [12/Dec/2019:16:54:38 +0530] “- – ” 200 – “-” “-“

– 127.0.0.1 – – [12/Dec/2019:16:54:38 +0530] “GET /pizzashack/1.0.0/menu HTTP/1.1” – – “https://localhost:9443/devportal/apis/462a90a2-9f2b-423f-9f58-28b95c30a184/test” “Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36”

– 127.0.0.1 – – [12/Dec/2019:16:54:38 +0530] “GET /am/sample/pizzashack/v1/api/menu HTTP/1.1” – – “https://localhost:9443/devportal/apis/462a90a2-9f2b-423f-9f58-28b95c30a184/test” “Synapse-PT-HttpComponents-NIO

از آنجایی که زمان اجرای WSO2 API Manager بر اساس Apache Tomcat است، می‌توانید از متغیر Access_Log_Valve در Tomcat همانطور که در زیر توضیح داده شده است برای پیکربندی لاگ‌های دسترسی به انتقال سرور HTTP استفاده کنید.

هشدار

تمامی گزینه های پشتیبانی شده در فایل زیر می باشد. بنابراین، مطمئن شوید که گزینه‌های مورد نیاز را حذف کرده و آن‌ها را در صورت لزوم فعال کنید.

# Default access log pattern

#access_log_pattern=%{X-Forwarded-For}i %h %l %u %t \”%r\” %s %b \”%{Referer}i\” \”%{User-Agent}i\”

# combinded log pattern

#access_log_pattern=%h %l %u %t \”%r\” %s %b \”%{Referer}i\” \”%{User-Agent}i\”

access_log_pattern=time=%t remoteHostname=%h localPort=%p localIP=%A requestMethod=%m requestURL=%U remoteIP=%a requestProtocol=%H HTTPStatusCode=%s queryString=%q

# common log pattern

#access_log_pattern=%h %l %u %t \”%r\” %s %b

# file prefix

access_log_prefix=http_gw

# file suffix

access_log_suffix=.log

# file date format

access_log_file_date_format=yyyy-MM-dd

#access_log_directory=”/logs

 

بیشتر بخوانید :  قابلیت Script Mediator در WSO2 API Manager

 

Audit Logs (لاگ‌‌های حسابرسی)

هنگام نظارت بر سرورهای تولید، حسابرسی یک نیاز اولیه است. به عنوان مثال، DevOps باید مکانیزم روشنی برای شناسایی افرادی که چه کارهایی انجام داده‌اند، و فیلتر کردن باگ‌های احتمالی سیستم داشته باشند. گزارش‌های حسابرسی یا مسیرهای حسابرسی شامل مجموعه‌ای از ورودی‌های گزارش هستند که توالی اقداماتی را که در یک دوره زمانی رخ داده‌اند، توصیف می‌کنند.

گزارش‌های حسابرسی به شما این امکان را می‌دهند که تمام اقدامات یک کاربر یا تمام اقدامات یا تغییرات وارد شده به یک ماژول خاص در سیستم و غیره را در یک دوره زمانی ردیابی کنید.

به عنوان مثال، تمام اقدامات یک کاربر را از اولین نقطه ورود به سرور ثبت می کند. به طور پیش‌فرض، گزارش‌های حسابرسی که هنگام اجرای WSO2 API-M ایجاد می‌شوند در فایل audit.log ذخیره می‌شوند که در فهرست

<API-M_HOME>/repository/logs قرار دارد.

پیکربندی گزارش های حسابرسی

گزارش‌های حسابرسی به‌طور پیش‌فرض در WSO2 API Manager (WSO2 API-M) از طریق پیکربندی‌های زیر که در فایل <API-M-HOME>/repository/conf/log4j2.properties هستند، فعال می‌شوند.

appender.AUDIT_LOGFILE.type = RollingFile

appender.AUDIT_LOGFILE.name = AUDIT_LOGFILE

appender.AUDIT_LOGFILE.fileName = ${sys:carbon.home}/repository/logs/audit.log

appender.AUDIT_LOGFILE.filePattern = ${sys:carbon.home}/repository/logs/audit-%d{MM-dd-yyyy}.log

appender.AUDIT_LOGFILE.layout.type = PatternLayout

appender.AUDIT_LOGFILE.layout.pattern = TID: [%tenantId] [%d] %5p {%c} – %m%ex%n

appender.AUDIT_LOGFILE.policies.type = Policies

appender.AUDIT_LOGFILE.policies.time.type = TimeBasedTriggeringPolicy

appender.AUDIT_LOGFILE.policies.time.interval = 1

appender.AUDIT_LOGFILE.policies.time.modulate = true

appender.AUDIT_LOGFILE.policies.size.type = SizeBasedTriggeringPolicy

appender.AUDIT_LOGFILE.policies.size.size=10MB

appender.AUDIT_LOGFILE.strategy.type = DefaultRolloverStrategy

appender.AUDIT_LOGFILE.strategy.max = 20

appender.AUDIT_LOGFILE.filter.threshold.type = ThresholdFilter

appender.AUDIT_LOGFILE.filter.threshold.level = INFO

رشد گزارش گزارش‌های حسابرسی را می‌توان با پیکربندی‌های مورد بحث در راهنمای Managing log growth (رشد گزارش مدیریت) مدیریت کرد.

اقدامات گزارش حسابرسی

در WSO2 API-M، گزارش های حسابرسی را می توان برای اقدامات کاربر زیر در پورتال ناشر و توسعه‌دهنده فعال کرد.

Publisher (ناشر)

Action

(عمل)

قالب نمونه

Sign in to the Publisher

(ورود به ناشر)

[2017-06-07 22:26:22,506]  INFO –  ‘devona@carbon.super [-1234]’ logged in at [2017-06-07 22:26:22,501+0530]

Create an API

(ایجاد یک API)

[2017-06-07 22:28:06,027]  INFO –  {“performedBy”:”admin”,”action”:”created”,”typ”:”API”,”info”:”

{\”provider\”:\”admin\”,\”name\”:\”PhoneVerification\”,\

“context\”:\”\\\/phoneverify\\\/1.0.0\”,\”version\”:\”1.0.0\”}”}

Update an API

(ویرایش یک API)

[2017-06-08 10:22:49,657]  INFO –  {“performedBy”:”admin”,”action”:”updated”,”typ”:”API”,”info”:”

{\”provider\”:\”admin\”,\”name\”:\”PhoneVerification\”,

\”context\”:\”\\\/phoneverify\\\/1.0.0\”,\”version\”:\”1.0.0\”}”}

Delete an API

(حذف یک API)

[2017-06-08 10:15:55,369]  INFO –  {“performedBy”:”admin”,”action”:”deleted”,”typ”:”API”,”info”:”

{\”provider\”:\”admin\”,\”name\”:\”PhoneVerification\”,\”version\”

:\”1.0.0\”}”}

Developer Portal (پورتال توسعه‌دهنده)

Action

(عمل)

قالب نمونه

Sign in to the Developer Portal

(ورود به پورتال توسعه‌دهنده)

[2017-06-07 22:34:54,684]  INFO –  ‘admin@carbon.super [-1234]’ logged in at [2017-06-07 22:34:54,682+0530]

Sign up via the Developer Portal

(ثبت نام در پورتال توسعه‌دهنده)

[2017-06-07 22:55:34,054]  INFO –  Initiator : admin@carbon.super | Action : Update Roles of User | Target : Kimmmy | Data : { Roles : [] } | Result : Success

Create an application

(ایجاد یک برنامه)

[2017-06-07 22:40:17,625]  INFO –  {“performedBy”:”admin”,”action”:”created”,”typ”:”Application”,”info”:”

{\”tier\”:\”20PerMin\”,\”name\”:\”TestApp\”,\”callbackURL\”:null}”}

Update an application

(ویرایش یک برنامه)

[2017-06-07 22:44:25,931]  INFO –  {“performedBy”:”admin”,”action”:”updated”,”typ”:”Application”,”info”:”

{\”tier\”:\”20PerMin\”,\”name\”:\”MobileApp\”,\”callbackURL\”:\”\”,

\”status\”:\”APPROVED\”}”}

Delete an application

(حذف یک برنامه)

[2017-06-07 22:45:59,093]  INFO –  {“performedBy”:”admin”,”action”:”deleted”,”typ”:”Application”,”info”:”

{\”tier\”:\”20PerMin\”,\”name\”:\”MobileApp\”,\”callbackURL\”:\”\”}”}

Subscribe to an application

(مشترک شدن در یک برنامه)

[2017-06-07 22:36:48,826]  INFO –  {“performedBy”:”admin”,”action”:”created”,”typ”:”Subscription”,”info”:”

{\”application_name\”:\”DefaultApplication\”,\”tier\”:\”Gold\”,\

“provider\”:\”admin\”,\”api_name\”:\”PhoneVerification\”,

\”application_id\”:1}”}

Unsubscribe from an application

 (لغو اشتراک از یک برنامه)

[2017-06-07 22:38:08,277]  INFO –  {“performedBy”:”admin”,”action”:”deleted”,”typ”:”Subscription”,”info”:”

{\”application_name\”:\”DefaultApplication\”,\”provider\”:\”admin\”,

\”api_name\”:\”PhoneVerification\”,\”application_id\”:1}”}

Traces (ردیابی)


OpenTracing (ردیابی باز)

در معماری توزیع‌شده API Manager، ردیابی یک پیام برای دیباگ یا اشکال‌زدایی و مشاهده مسیر پیام مهم است. این به عنوان ردیابی توزیع شده شناخته می شود. OpenTracing به شما امکان می‌دهد ردیابی توزیع شده را برای WSO2 API Manager فعال کنید. Open tracing روشی را برای توسعه دهندگان ارائه می‌دهد تا رشته را دنبال کنند – برای ردیابی درخواست ها از ابتدا تا انتها در  across touchpoints (نقاط تماس) و  understand distributed systems (سیستم های توزیع شده) در مقیاس. OpenTracing همچنین به ردیابی پیام و شناسایی تأخیرهای رخ داده در هر فرآیند یا متد کمک می کند. بنابراین، OpenTracing به شما کمک می‌کند تا یک تحلیل مربوط به زمان را انجام دهید.

WSO2 API Manager انواع روش های زیر را برای بازیابی داده های ابزاردار پشتیبانی می کند.

  • Jaeger
  • Zipkin
  • Log

برای اطلاعات بیشتر،  OpenTracer Configurationsرا ببینید.

این مطلب چقدر مفید بود ؟

روی یک ستاره کلیک کنید تا به آن امتیاز دهید

میانگین امتیاز / 5. نتایج آرا:

تاکنون رأی ندارید! اولین نفری باشید که به این پست امتیاز می دهد.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *