Работа с данными через API
При необходимости пользователь может использовать REST API для обращения к компоненту сервиса в формате запрос-ответ. В качестве среды отладки отдельных сценариев работы рекомендуется использовать раздел Dev Tools.
- Выполните вход в интерфейс сервиса.
- Откройте боковое меню слева и перейдите в раздел Dev Tools.
- Выполните команду поиска:
GET /test-index/_search
где
test-index
– переменная, используемая в качестве индекса.Компонент сервиса обеспечивает работу со шлюзом
Opensearch-grpc-gateway
, необходимым для взаимодействия с интегрированной средой gRPC. Opensearch-grpc-gateway
используется для конвертации gRPC-коммуникации между сервисами в запросы REST API.Для конвертации gRPC в REST API:
- Укажите Maven-зависимость для Java в вашем проекте.
Пример type=xml<dependency> <groupId>io.grpc</groupId> <artifactId>grpc-netty-shaded</artifactId> <scope>runtime</scope> <version>${io.grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-protobuf</artifactId> <version>${io.grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-stub</artifactId> <version>${io.grpc.version}</version> </dependency> <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-testing</artifactId> <version>${io.grpc.version}</version> <scope>test</scope> </dependency> // Генерация файлов для `proto` файла gRPC <build> <plugins> <plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>${protobuf-maven-plugin.version}</version> <configuration> <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact> <pluginId>grpc-java</pluginId> <pluginArtifact>io.grpc:protoc-gen-grpc-java:${io.grpc.version}:exe:${os.detected.classifier}</pluginArtifact> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
- Определите в проекте
proto
для описания структуры данных. Структура проекта выглядит следующим образом:
Структура type=xml-{java-project} --src ---main ----proto ----java ----resources --pom.xml
proto
для добавления в ваш проект представлен ниже.proto type=javasyntax = "proto3"; option java_multiple_files = true; import "google/protobuf/empty.proto"; package ru.sbrf.grpc; message IndexData { // system time milli seconds since epoch int64 datetime = 1; string className = 2; string message = 3; string traceId = 4; string logLevel = 5; string serviceName = 6; string serviceVersion = 7; string instanceId = 8; } message Filter { repeated string field = 1; string query = 2; } message PageRequest { int32 size = 1; int32 offset = 2; bool withCount = 3; } message PageResponse { uint32 size = 1; uint32 offset = 2; uint64 total = 3; } message IndexDataRequest { string index = 1; int64 dateTimeFrom = 2; int64 dateTimeTo = 3; Filter filter = 4; PageRequest pageInfo = 5; } message SearchResponse { repeated IndexData searchResponse = 1; PageResponse pageInfo = 2; } message IndicesResponse { repeated Index indices = 1; } message Index { string name = 1; } service OpensearchService { rpc search(IndexDataRequest) returns (SearchResponse); rpc indicesList(google.protobuf.Empty) returns (IndicesResponse); }
В примере выше объявлен сервис
OpensearchService
, где search
– метод поиска данных, indicesList
– метод получения доступных индексов.Пример вызова клиента Java-gRPC представлен ниже.
Пример type=java... import static io.grpc.Metadata.ASCII_STRING_MARSHALLER; public class GrpcClient { public static void main(String[] args) { // Настройка подключения к шлюзу ManagedChannel channel = ManagedChannelBuilder.forAddress("opensearch-grc-gateway", 8080) .usePlaintext() .build(); // Создание клиента gRPC OpensearchServiceGrpc.OpensearchServiceBlockingStub stub = OpensearchServiceGrpc.newBlockingStub(channel) .withCallCredentials(new CallCredentials() { @Override // Настройка Metadata – внутреннего класса gRPC public void applyRequestMetadata(RequestInfo requestInfo, Executor executor, MetadataApplier metadataApplier) { executor.execute(() -> { try { Metadata headers = new Metadata(); // Передача JWT-токена для авторизации headers.put(Metadata.Key.of("Authorization", ASCII_STRING_MARSHALLER), "Bearer token"); metadataApplier.apply(headers); } catch (Throwable e) { metadataApplier.fail(Status.UNAUTHENTICATED.withCause(e)); } }); } @Override public void thisUsesUnstableApi() { } }); // Пример вызова поиска данных. Задаются индекс данных, диапазон дат, фильтр поиска, пагинация SearchResponse helloResponse = stub.search(IndexDataRequest.newBuilder().setIndex("test") .setDateTimeFrom(132123123) .setDateTimeTo(132123125) .setFilter(Filter.newBuilder().addField("message").setQuery("test*")) .setPageInfo(PageRequest.newBuilder() .setSize(100) .setOffset(0) .setWithCount(true) .build()) .build()); // Вывод результата helloResponse.getSearchResponseList().forEach(System.out::println); System.out.println("SIZE: " + helloResponse.getSearchResponseList().size()); System.out.println("OFFSET: " + helloResponse.getPageInfo().getOffset()); System.out.println("TOTAL: " + helloResponse.getPageInfo().getTotal()); channel.shutdown(); } }
В демопримерах реализованы стандартные сценарии, демонстрирующие работу отдельных сервисов Платформы ГосТех. Отправка тестовых запросов в демопримерах позволит вам ознакомиться с функциями того или иного сервиса. Доступные демопримеры и описания реализованной в них функциональности представлены ниже.
Журналирование
Создание и отправка на сервер трёх уровней логов: debug, error, info. Просмотр отправленных логов в Elastic