Почему я не могу просмотреть статистику в магазине WSO2 API Manager?

Все, пожалуйста, обратите внимание, что этот вопрос был обновлен, так как недавно у меня были журналы для работы. Ниже журнала находится исходная публикация с моими конфигурациями и поведением, которое я видел. Сегодня WSO2 APIM продолжает отправлять сообщения получателям BAM, которые обновляют базу данных статистики. Однако, когда я нажимаю на любую ссылку статистики в издателе, я получаю:

TID: [0] [AM] [2014-03-04 13:43:18,815] ERROR {org.wso2.carbon.apimgt.hostobjects.APIProviderHostObject} -  Error while invoking APIUsageStatisticsClient for ProviderAPIUsage {org.wso2.carbon.apimgt.hostobjects.APIProviderHostObject}
org.wso2.carbon.apimgt.usage.client.exception.APIMgtUsageQueryServiceClientException: Error occurred while querying from JDBC database
        at org.wso2.carbon.apimgt.usage.client.APIUsageStatisticsClient.queryFirstAccess(APIUsageStatisticsClient.java:1747)
        at org.wso2.carbon.apimgt.usage.client.APIUsageStatisticsClient.getFirstAccessTime(APIUsageStatisticsClient.java:1675)
        at org.wso2.carbon.apimgt.hostobjects.APIProviderHostObject.jsFunction_getFirstAccessTime(APIProviderHostObject.java:2911)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at org.mozilla.javascript.MemberBox.invoke(MemberBox.java:126)
        at org.mozilla.javascript.FunctionObject.call(FunctionObject.java:386)
        at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:42)
        at org.jaggeryjs.rhino.publisher.modules.statistics.c1._c_getFirstAccessTime_13(/publisher/modules/statistics/usage.jag:351)
        at org.jaggeryjs.rhino.publisher.modules.statistics.c1.call(/publisher/modules/statistics/usage.jag)
        at org.mozilla.javascript.ScriptRuntime.applyOrCall(ScriptRuntime.java:2430)
        at org.mozilla.javascript.BaseFunction.execIdCall(BaseFunction.java:269)
        at org.mozilla.javascript.IdFunctionObject.call(IdFunctionObject.java:97)
        at org.mozilla.javascript.optimizer.OptRuntime.call2(OptRuntime.java:42)
        at org.jaggeryjs.rhino.publisher.modules.statistics.c0._c_anonymous_13(/publisher/modules/statistics/module.jag:29)
        at org.jaggeryjs.rhino.publisher.modules.statistics.c0.call(/publisher/modules/statistics/module.jag)
        at org.mozilla.javascript.optimizer.OptRuntime.call1(OptRuntime.java:32)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0._c_anonymous_1(/publisher/site/blocks/stats/ajax/stats.jag:220)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0.call(/publisher/site/blocks/stats/ajax/stats.jag)
        at org.mozilla.javascript.optimizer.OptRuntime.call0(OptRuntime.java:23)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0._c_script_0(/publisher/site/blocks/stats/ajax/stats.jag:4)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0.call(/publisher/site/blocks/stats/ajax/stats.jag)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:394)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3091)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0.call(/publisher/site/blocks/stats/ajax/stats.jag)
        at org.jaggeryjs.rhino.publisher.site.blocks.stats.ajax.c0.exec(/publisher/site/blocks/stats/ajax/stats.jag)
        at org.jaggeryjs.scriptengine.engine.RhinoEngine.execScript(RhinoEngine.java:570)
        at org.jaggeryjs.scriptengine.engine.RhinoEngine.exec(RhinoEngine.java:273)
        at org.jaggeryjs.jaggery.core.manager.WebAppManager.execute(WebAppManager.java:432)
        at org.jaggeryjs.jaggery.core.JaggeryServlet.doPost(JaggeryServlet.java:29)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:749)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:339)
        at org.jaggeryjs.jaggery.core.JaggeryFilter.doFilter(JaggeryFilter.java:21)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
        at org.wso2.carbon.tomcat.ext.valves.CompositeValve.continueInvocation(CompositeValve.java:178)
        at org.wso2.carbon.tomcat.ext.valves.CarbonTomcatValve$1.invoke(CarbonTomcatValve.java:47)
        at org.wso2.carbon.webapp.mgt.TenantLazyLoaderValve.invoke(TenantLazyLoaderValve.java:56)
        at org.wso2.carbon.tomcat.ext.valves.TomcatValveContainer.invokeValves(TomcatValveContainer.java:47)
        at org.wso2.carbon.tomcat.ext.valves.CompositeValve.invoke(CompositeValve.java:141)
        at org.wso2.carbon.tomcat.ext.valves.CarbonStuckThreadDetectionValve.invoke(CarbonStuckThreadDetectionValve.java:156)
        at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
        at org.wso2.carbon.tomcat.ext.valves.CarbonContextCreatorValve.invoke(CarbonContextCreatorValve.java:52)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
        at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1653)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:744)
Caused by: java.sql.SQLException: Incorrect syntax near 'limit'.
        at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:372)
        at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2988)
        at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2421)
        at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:671)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:505)
        at net.sourceforge.jtds.jdbc.JtdsStatement.executeQuery(JtdsStatement.java:1427)
        at org.wso2.carbon.apimgt.usage.client.APIUsageStatisticsClient.queryFirstAccess(APIUsageStatisticsClient.java:1729)
        ... 63 more
TID: [0] [AM] [2014-03-04 13:43:18,836] ERROR {JAGGERY.modules.statistics.usage:jag} -  java.lang.NullPointerException: null {JAGGERY.modules.statistics.usage:jag}

Я настроил WSo2 API Manager 1.6.0 и BAM 2.4.0 на использование одной и той же конфигурации источника данных для WSO2AM_STATS_DB. Для магазина это одна запись WSO2AM_STATS_DB, которая соответствует записи на сервере BAM (ниже), а API-Manager.xml обновляется до:

  <APIUsageTracking>
        <Enabled>true</Enabled>
<PublisherClass>org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageDataBridgeDataPublisher</PublisherClass>
        <ThriftPort>7612</ThriftPort>
        <BAMServerURL>tcp://myBAMserver:7612/</BAMServerURL>
        <BAMUsername>user</BAMUsername>
        <BAMPassword>pwd</BAMPassword>
        <DataSourceName>jdbc/WSO2AM_STATS_DB</DataSourceName>
        <GoogleAnalyticsTracking>
             <Enabled>false</Enabled>
             <TrackingID>UA-XXXXXXXX-X</TrackingID>
       </GoogleAnalyticsTracking>
    </APIUsageTracking>

а теперь источник данных для APIM:

<datasource>
    <name>WSO2AM_STATS_DB</name>
    <description>The datasource used for getting statistics to API Manager</description>
    <jndiConfig>
        <name>jdbc/WSO2AM_STATS_DB</name>
    </jndiConfig>
    <definition type="RDBMS">
        <configuration>
            <defaultAutoCommit>false</defaultAutoCommit>
            <url>jdbc:jtds:sqlserver://mydbserver:1433/wso2_apiStatsdb</url>
            <username>wso2storeuser</username>
            <password>storepwd</password>
            <driverClassName>net.sourceforge.jtds.jdbc.Driver</driverClassName>
            <maxActive>50</maxActive>
            <maxWait>60000</maxWait>
            <testOnBorrow>true</testOnBorrow>
            <validationQuery>SELECT 1</validationQuery>
            <validationInterval>30000</validationInterval>
        </configuration>
    </definition>
 </datasource>

Для сервера BAM вот мои источники данных:

<datasource>
        <name>WSO2_CARBON_DB</name>
        <description>The datasource used for API Manager database</description>
        <jndiConfig>
            <name>jdbc/WSO2CarbonDB</name>
        </jndiConfig>
        <definition type="RDBMS">
            <configuration>
                <defaultAutoCommit>false</defaultAutoCommit>
                <url>jdbc:jtds:sqlserver://mydbserver:1433/wso2_carbondb</url>
                <username>user</username>
                <password>pwd</password>
                <driverClassName>net.sourceforge.jtds.jdbc.Driver</driverClassName>
                <maxActive>50</maxActive>
                <maxWait>60000</maxWait>
                <testOnBorrow>true</testOnBorrow>
                <validationQuery>SELECT 1</validationQuery>
                <validationInterval>30000</validationInterval>
            </configuration>
        </definition>
    </datasource>

    <datasource>
        <name>WSO2AM_STATS_DB</name>
        <description>The datasource used for getting statistics to API Manager</description>
        <jndiConfig>
            <name>jdbc/WSO2AM_STATS_DB</name>
        </jndiConfig>
        <definition type="RDBMS">
            <configuration>
                <defaultAutoCommit>false</defaultAutoCommit>
                <url>jdbc:jtds:sqlserver://mydbserver:1433/wso2_apiStatsdb</url>
                <username>user</username>
                <password>pwd</password>
                <driverClassName>net.sourceforge.jtds.jdbc.Driver</driverClassName>
                <maxActive>50</maxActive>
                <maxWait>60000</maxWait>
                <testOnBorrow>true</testOnBorrow>
                <validationQuery>SELECT 1</validationQuery>
                <validationInterval>30000</validationInterval>
            </configuration>
        </definition>
     </datasource>

    <datasource>
        <name>WSO2BAM_DATASOURCE</name>
        <description>The datasource used for analyzer data</description>
        <definition type="RDBMS">
            <configuration>
                <defaultAutoCommit>false</defaultAutoCommit>
                <url>jdbc:jtds:sqlserver://mydbserver:1433/wso2_apiStatsdb</url>
                <username>user</username>
                <password>pwd</password>
                <driverClassName>net.sourceforge.jtds.jdbc.Driver</driverClassName>
                <maxActive>50</maxActive>
                <maxWait>60000</maxWait>
                <testOnBorrow>true</testOnBorrow>
                <validationQuery>SELECT 1</validationQuery>
                <validationInterval>30000</validationInterval>
            </configuration>
        </definition>
    </datasource>

        <datasource>
        <name>WSO2BAM_CASSANDRA_DATASOURCE</name>
        <description>The datasource used for Cassandra data</description>
        <definition type="RDBMS">
            <configuration>
                <url>jdbc:cassandra://localhost:9161/EVENT_KS</url>
                <username>admin</username>
                <password>admin</password>
            </configuration>
        </definition>
    </datasource>

    <datasource>
        <name>WSO2BAM_UTIL_DATASOURCE</name>
        <description>The datasource used for BAM utilities, such as message store etc..</description>
        <definition type="RDBMS">
            <configuration>
                <url>jdbc:cassandra://localhost:9161/BAM_UTIL_KS</url>
                <username>admin</username>
                <password>admin</password>
            </configuration>
        </definition>
    </datasource>

    <!-- The URL configs are loaded from cassandra-component.xml -->
    <datasource>
        <name>WSO2BAM_HIVE_INCREMENTAL_DATASOURCE</name>
        <definition type="RDBMS">
            <configuration>
                <username>admin</username>
                <password>admin</password>
                <dataSourceProps>
                    <property name="replicationFactor">1</property>
                    <property name="strategyClass">org.apache.cassandra.locator.SimpleStrategy</property>
                    <property name="readConsistencyLevel">QUORUM</property>
                    <property name="writeConsistencyLevel">QUORUM</property>
                    <property name="keyspaceName">HIVE_INCREMENTAL_KS</property>
                </dataSourceProps>
            </configuration>
        </definition>
    </datasource>

Когда я смотрю в mydbserver/wso2_apiStatsdb, я вижу, что следующие таблицы были созданы и обновлены данными:

Обновление API_REQUEST_SUMMARY, API_Resource_USAGE_SUMMARY: добавлены и обновлены некоторые дополнительные таблицы... API_FAULT_SUMMARY, API_RESPONSE_SUMMARY, API_VERSION_USAGE_SUMMARY

Однако, когда я перехожу на страницу издателя, я получаю: введите здесь описание изображения

Насколько я могу судить, я обновил издатель/магазин и шлюз/менеджер ключей для отправки данных на сервер BAM. Похоже, что сервер BAM обрабатывает и помещает эти сводные данные в базу данных сервера sql. Мои записи для базы данных SQL-сервера совпадают с конфигурацией издателя/хранилища и конфигурацией сервера BAM. У кого-нибудь есть идеи, что мне не хватает, что позволит мне увидеть статистику в издателе?


person Gammonster    schedule 13.02.2014    source источник


Ответы (4)


Гаммонстер, это было выяснено. Похоже, что дьявол действительно кроется в деталях — среда выполнения пыталась выполнить SQL-запрос с использованием ключевого слова «limit» в базе данных SQL Server, а SQL Server не поддерживает «limit». Вместо этого у него есть «верх».

Был бы признателен, если бы в документации по продукту прямо указывалось, что SQL Server не является предпочтительным экземпляром БД для BAM.

person rvvind    schedule 08.08.2014
comment
Или, возможно, если бы SQL Server был включен в набор кодов и имел бы SQL, использующий «top». - person Gammonster; 11.08.2014
comment
Та же проблема здесь. Каково ваше решение этой проблемы? Вы изменили код wso2 и перекомпилировали его? - person J D; 14.09.2016

Не могли бы вы проверить, установлен ли EnableBillingAndUsage на false. Это доступно в conf/api-manager.xml

<EnableBillingAndUsage>false</EnableBillingAndUsage>
person Nadeesha    schedule 17.02.2014
comment
Спасибо за ваше предложение. В настоящее время для этого параметра установлено значение false на сервере Store/Publisher. Поскольку база данных записывается, мне, должно быть, не хватает какой-то простой части конфигурации... - person Gammonster; 17.02.2014
comment
Как насчет шлюза, для которого в конфигурации установлено значение false? - person Nadeesha; 17.02.2014
comment
Это также false, вот раздел конфигурации: ‹EnableBillingAndUsage›false‹/EnableBillingAndUsage› ‹APIUsageTracking›‹Enabled›true‹/Enabled›‹PublisherClass›org.wso2.carbon.apimgt.usage.publisher.APIMgtUsageDataBridgeDataPublisher‹/PublisherClass› ‹ThriftPort›7612‹/ThriftPort›‹BAMServerURL›tcp://myBAMServer:7612‹/BAMServerURL› ‹BAMUsername›admin‹/BAMUsername›‹BAMPassword›admin‹/BAMPassword›‹DataSourceName›jdbc/WSO2AM_STATS_TTracAnalytics/DataSourceName› ›‹Enabled›false‹/Enabled› ‹TrackingID›UA-XXXXXXXX-X‹/TrackingID›‹/GoogleAnalyticsTracking›‹/APIUsageTracking› - person Gammonster; 17.02.2014
comment
В журналах магазина/паба я начал получать следующее: ОШИБКА {org.wso2.carbon.apimgt.hostobjects.APIProviderHostObject} — ошибка при вызове APIUsageStatisticsClient для ProviderAPIUsage {org.wso2.carbon.apimgt.hostobjects.APIProviderHostObject} org. wso2.carbon.apimgt.usage.client.exception.APIMgtUsageQueryServiceClientException: произошла ошибка при запросе из базы данных JDBC - person Gammonster; 17.02.2014
comment
Причина: java.sql.SQLException: неправильный синтаксис рядом с «пределом». TID: [0] [AM] [2014-02-17 12:03:31,453] ОШИБКА {JAGGERY.modules.statistics.usage:jag} - java.lang.NullPointerException: null {JAGGERY.modules.statistics.usage:jag } - person Gammonster; 17.02.2014
comment
Эти ошибки возникают всякий раз, когда я нажимаю «Все статистические данные» или «Статистика» в издателе. Я обрезал некоторые детали, чтобы я мог добавить полную ошибку, если хотите. - person Gammonster; 17.02.2014

Вы используете BAM на смещении порта 1? Насколько я вижу, у вас BAM работает на другом сервере. Попробуйте запустить BAM со смещением порта 1. Конфигурация по умолчанию, предоставленная на сайте, предназначена для случая использования, когда диспетчер API и BAM работают на одном сервере со смещением портов (API M -0 и BAM -1). Следовательно, все соответствующие порты бережливости также увеличиваются на 1 в конфигурации по умолчанию. Поэтому я предлагаю вам запустить BAM со смещением 1.

Тем временем, пожалуйста, проверьте, содержит ли база данных MQSQL, в которой есть сводная статистика, какие-либо данные.

person Nadeesha    schedule 14.02.2014
comment
Я уже подтвердил, что таблицы API_REQUEST_SUMMARY, API_Resource_USAGE_SUMMARY записываются. Должны ли быть дополнительные? - person Gammonster; 14.02.2014
comment
Я убедился, что при запуске BAM в журнале отмечаются: Порт Thrift: 7612 {org.wso2.carbon.core.transports.http.HttpsTransportListener} - person Gammonster; 14.02.2014

Это также может произойти, если вы неправильно настроили сводную базу данных в диспетчере API. Судя по тому, что вы упомянули, диспетчер API правильно публикует данные, но не получает сводные данные. Проверьте, определили ли вы WSO2AM_STATS_DB в master-datasources.xml внутри каталога APIM.

person Amila De Silva    schedule 14.02.2014
comment
Определение для диспетчера API WSO2AM_STATS_DB соответствует определению серверов BAM master-datasources.xml (за исключением того, что user/pwd отличается). Так что BAM должен писать в эти таблицы, а APIM читать из тех же таблиц. - person Gammonster; 14.02.2014
comment
Видите ли вы какие-либо ошибки в консоли диспетчера API при загрузке страницы статистики? И вы получаете такое же представление при попытке загрузить страницу «Вся статистика»? - person Amila De Silva; 14.02.2014
comment
Я не вижу ошибок в файле wso2carbon.log и никаких ошибок не отображается на консоли издателя. Я просто получаю стандартный дисплей, который я прикрепил к исходному вопросу. Я получаю такое же отображение акций при попытке получить доступ ко всей статистике или статистике. - person Gammonster; 14.02.2014
comment
Одна вещь, которую вы можете сделать, это попытаться запросить таблицы (API_REQUEST_SUMMARY, API_Resource_USAGE_SUMMARY), подключившись к базе данных с учетными данными, которые вы предоставили для диспетчера API. Если вы не видите никаких данных, возможно, возникла проблема с частью анализа данных. - person Amila De Silva; 14.02.2014
comment
Я обновил исходный вопрос, включив в него запись master-datasources.xml из APIM. На всякий случай, если у меня опечатка или что-то... - person Gammonster; 14.02.2014
comment
Хорошая идея, именно так я до сих пор проверял базу данных. У меня есть дополнительные таблицы с данными, поэтому теперь я вижу следующие таблицы: API_REQUEST_SUMMARY, API_Resource_USAGE_SUMMARY API_FAULT_SUMMARY, API_RESPONSE_SUMMARY, API_VERSION_USAGE_SUMMARY. Я не знаю, пропустил ли я что-то, и поэтому APIM сбит с толку? - person Gammonster; 14.02.2014
comment
Используете ли вы распределенное развертывание? Предоставленные вами файлы конфигурации — это файлы узла издателя? - person Amila De Silva; 14.02.2014
comment
У меня есть сервер APIM, на котором работают издатель и магазин, сервер шлюза, на котором работает диспетчер шлюза и ключей, и сервер BAM. вышеприведенные файлы конфигурации взяты из Publisher и Store, а также с сервера BAM (выше я отметил фрагмент конфигурации, к какой области он относится). - person Gammonster; 14.02.2014
comment
Есть ли у вас какие-либо сводные данные в какой-либо из таблиц? Скажем, API_REQUEST_SUMMARY. - person Amila De Silva; 16.02.2014
comment
API_REQUEST_SUMMARY имеет 5 строк, API_Resource_USAGE_SUMMARY имеет 15 строк, API_RESPONSE_SUMMARY имеет 15 строк, API_VERSION_USAGE_SUMMARY имеет 15 строк. - person Gammonster; 17.02.2014