Работа с данными через API

При необходимости пользователь может использовать REST API для обращения к компоненту сервиса в формате запрос-ответ. В качестве среды отладки отдельных сценариев работы рекомендуется использовать раздел Dev Tools.

Просмотр данных

  1. Выполните вход в интерфейс сервиса.
  2. Откройте боковое меню слева и перейдите в раздел Dev Tools.
  3. Выполните команду поиска:
GET /test-index/_search
где test-index – переменная, используемая в качестве индекса.

Конвертация gRPC в REST API

Компонент сервиса обеспечивает работу со шлюзом Opensearch-grpc-gateway, необходимым для взаимодействия с интегрированной средой gRPC. Opensearch-grpc-gateway используется для конвертации gRPC-коммуникации между сервисами в запросы REST API.
Для конвертации gRPC в REST API:
  1. Укажите 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>
  1. Определите в проекте proto для описания структуры данных. Структура проекта выглядит следующим образом:
Структура type=xml
-{java-project}

--src

---main

----proto

----java

----resources

--pom.xml
proto для добавления в ваш проект представлен ниже.
proto type=java
syntax = "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
Предыдущий раздел
Просмотр журнала
Следующий раздел
Нагрузочное тестирование
Была ли страница полезной?