Проверки качества данных внешних систем

В этой статье:

Совет

Описание получения результатов проверок см. по ссылке

Сохранение результатов качества данных

POST-запрос /v1/dg/dq-checks/results/save

  • Пример запроса:

    {
        "checkEtalonId": "987e0ae2-c168-11ed-a41c-23a5c36cad53",
        "checkTypeName": "dq_check_formit",
        "executionDate": "2023-03-02T13:00:30+03:00",
        "rowCount": 100,
        "rowException": 15,
        "score": 85
    }
    

В случае успешного сохранения результата проверки качества данных возвращается пустой ответ со статусом 200.

Успешное сохранение результата качества данных возможно только в случае если выполнены все следующие условия:

  • В системе существует актив проверки качества с типом checkTypeName (из тела запроса) и эталонным ключом checkEtalonId (из тела запроса);

  • Существует хотя бы одна входящая связь типа has_dq_check к активу проверки качества от актива правила качества (типа "Правило качества" (dq_rule);

  • Существует хотя бы одна исходящая связь типа dq_check_link от актива проверки качества к активу проверяемого объекта.

В случае ошибки возвращается ответ со статусом 500.

  • Пример ответа со статусом 500:

    {
        "details": {
            "info": [],
            "warning": [],
            "error": [
                {
                    "domain": "DG_QUALITY_CHECK_RUNTIME_EXCEPTION",
                    "source": null,
                    "code": "EX_QUALITY_CHECK_NOT_FOUND",
                    "severity": "ERROR",
                    "externalMessage": "Актив проверки качества (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) не найден",
                    "internalMessage": "QualityCheckRuntimeException: Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found.",
                    "details": "com.universe.dg.dq.checks.exception.QualityCheckRuntimeException: [EX_QUALITY_CHECK_NOT_FOUND] Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found.\r\n\tat com.universe.dg.dq.checks.service.impl.QualityChecksServiceImpl.save(QualityChecksServiceImpl.java:154)\r\n\tat com.universe.dg.rest.v1.dq.checks.service.DataGovernanceQualityChecksRestService.saveCheckResult(DataGovernanceQualityChecksRestService.java:143)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)\r\n\tat org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)\r\n\tat org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)\r\n\tat org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:357)\r\n\tat org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:176)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\n",
                    "params": []
                }
            ]
        },
        "errorMessage": "Quality check (type name: [dq_check_formit], etalon id: [987e0ae2-c168-11ed-a41c-23a5c36cad51]) is not found."
    }
    

Получение активов проверок качества

POST-запрос /v1/dg/dq-checks/checks

  • Пример запроса:

    {
      "typeName": "dq_check_formit",
      "page": 0,
      "count": 10
    }
    

В случае успеха возвращается ответ со статусом 200 (помимо полей checkEtalonId и executionDate возвращаются все простые заполненные атрибуты актива проверки качества).

  • Пример ответа:

    {
        "totalCount": 2,
        "typeName": "dq_check_formit",
        "dqChecks": [
            {
                "score_quality_low": 10,
                "status": "S-3",
                "technical_rule": "rule_1",
                "executionDate": "2023-03-02T22:00:30+03:00",
                "RuleType": "RT-2",
                "id": "id_1",
                "score_quality_high": 80,
                "checkEtalonId": "987e0ae2-c168-11ed-a41c-23a5c36cad53"
            },
            {
               "executionDate": "2023-03-02T11:00:30+03:00",
                "id": "ssss",
                "checkEtalonId": "860c2845-c310-11ed-8836-23a5c36cad53",
                "technical_rule": "aaa"
            }
        ]
    }
    

В случае ошибки (указан несуществующий тип актива) возвращается ответ со статусом 500.

  • Пример ответа со статусом 500:

    {
        "details": {
            "info": [],
            "warning": [],
            "error": [
                {
                    "domain": null,
                    "source": null,
                    "code": "FOREIGN_EXCEPTION",
                    "severity": "CRITICAL",
                    "externalMessage": null,
                    "internalMessage": "NullPointerException: Asset type with name [dq_check_formit1] was not found in DG model",
                    "details": "java.lang.NullPointerException: Asset type with name [dq_check_formit1] was not found in DG model\r\n\tat java.base/java.util.Objects.requireNonNull(Objects.java:246)\r\n\tat com.universe.dg.dq.checks.service.impl.QualityChecksServiceImpl.loadQualityChecks(QualityChecksServiceImpl.java:269)\r\n\tat com.universe.dg.rest.v1.dq.checks.service.DataGovernanceQualityChecksRestService.getQualityChecks(DataGovernanceQualityChecksRestService.java:112)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:566)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:179)\r\n\tat org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:201)\r\n\tat org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:104)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:59)\r\n\tat org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:96)\r\n\tat org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)\r\n\tat org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)\r\n\tat org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:265)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:234)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:208)\r\n\tat org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:160)\r\n\tat org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:225)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:304)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:217)\r\n\tat javax.servlet.http.HttpServlet.service(HttpServlet.java:681)\r\n\tat org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:279)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:357)\r\n\tat org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:176)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)\r\n\tat org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)\r\n\tat org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)\r\n\tat org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)\r\n\tat org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)\r\n\tat org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)\r\n\tat org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)\r\n\tat org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)\r\n\tat org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)\r\n\tat org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)\r\n\tat org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)\r\n\tat org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)\r\n\tat org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)\r\n\tat org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743)\r\n\tat org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)\r\n\tat org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)\r\n\tat org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)\r\n\tat java.base/java.lang.Thread.run(Thread.java:834)\r\n",
                    "params": []
                }
            ]
        },
        "errorMessage": "Asset type with name [dq_check_formit1] was not found in DG model"
    }