Exemple #1
0
        public async Task ExecuteQueryAsync_WhenCalled_ThanReturnCorrectValues()
        {
            // Arrange
            var     queryClientMock        = new Mock <ICslQueryProvider>();
            var     adminClientMock        = new Mock <ICslAdminProvider>();
            var     loggerMock             = new Mock <ILogger <KustoQueryExecutor> >().Object;
            Metrics metricsHistograms      = Metrics.Create(GetMockTelemetryClient());
            var     expectedDataReaderMock = new Mock <IDataReader>();
            var     queryData = new QueryData("test command text", "test index name");

            queryClientMock.Setup(client =>
                                  client.ExecuteQueryAsync(
                                      It.IsAny <string>(),
                                      It.IsAny <string>(),
                                      It.IsAny <ClientRequestProperties>()))
            .Returns(Task.FromResult(expectedDataReaderMock.Object));

            KustoQueryExecutor kustoQueryExecutor = new KustoQueryExecutor(queryClientMock.Object, adminClientMock.Object, loggerMock, metricsHistograms);
            RequestContext     requestContext     = new RequestContext {
                CorrelationId = Guid.Empty
            };

            // Act
            var(timeTaken, dataReader) = await kustoQueryExecutor.ExecuteQueryAsync(queryData, requestContext);

            // Assert
            Assert.IsTrue(timeTaken.Ticks > 0);
            Assert.AreEqual(expectedDataReaderMock.Object, dataReader);
        }
Exemple #2
0
        public async Task ExecuteControlCommandAsync_WhenCalled_ThenReturnDataReader()
        {
            // Arrange
            var queryClientMock        = new Mock <ICslQueryProvider>();
            var adminClientMock        = new Mock <ICslAdminProvider>();
            var loggerMock             = new Mock <ILogger <KustoQueryExecutor> >().Object;
            var metricsHistograms      = new Metrics();
            var expectedDataReaderMock = new Mock <IDataReader>();

            adminClientMock.Setup(client =>
                                  client.ExecuteControlCommandAsync(
                                      It.IsAny <string>(),
                                      It.IsAny <string>(),
                                      It.IsAny <ClientRequestProperties>()))
            .Returns(Task.FromResult(expectedDataReaderMock.Object));

            KustoQueryExecutor kustoQueryExecutor = new KustoQueryExecutor(queryClientMock.Object, adminClientMock.Object, loggerMock, metricsHistograms);
            RequestContext     requestContext     = new RequestContext {
                CorrelationId = Guid.Empty
            };

            // Act
            var result = await kustoQueryExecutor.ExecuteControlCommandAsync("test command", requestContext);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(expectedDataReaderMock.Object, result);
        }
Exemple #3
0
        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {
            ConfigureTelemetryServices(services);

            services.AddControllers();

            services.AddSingleton(Log.Logger);

            services.AddSingleton <IConnectionDetails, KustoConnectionDetails>(
                s => KustoConnectionDetailsFactory.MakeFromConfiguration(Configuration as IConfigurationRoot));

            services.AddSingleton(
                s => MetadataConnectionDetailsFactory.MakeFromConfiguration(Configuration as IConfigurationRoot));

            services.AddSingleton <IQueryExecutor, KustoQueryExecutor>(
                s =>
            {
                var conn = KustoQueryExecutor
                           .CreateKustoConnectionStringBuilder(s.GetRequiredService <IConnectionDetails>());

                return(new KustoQueryExecutor(
                           KustoClientFactory.CreateCslQueryProvider(conn),
                           KustoClientFactory.CreateCslAdminProvider(conn),
                           s.GetRequiredService <ILogger <KustoQueryExecutor> >(),
                           s.GetRequiredService <Telemetry.Metrics>()));
            });

            services.AddHttpContextAccessor();
            services.AddScoped(
                s => new RequestContext(s.GetRequiredService <IHttpContextAccessor>()));

            services.AddTransient <ITranslator, ElasticQueryTranslator>();

            services.AddTransient <IKustoDataAccess, KustoDataAccess>(
                s => new KustoDataAccess(
                    s.GetRequiredService <IQueryExecutor>(),
                    s.GetRequiredService <RequestContext>(),
                    s.GetRequiredService <ILogger <KustoDataAccess> >()));

            services.AddTransient <ISchemaRetrieverFactory, SchemaRetrieverFactory>(
                s => new SchemaRetrieverFactory(
                    s.GetRequiredService <ILogger <SchemaRetriever> >(),
                    s.GetRequiredService <IKustoDataAccess>()));

            services.AddTransient <IVisitor, ElasticSearchDSLVisitor>(
                s => new ElasticSearchDSLVisitor(
                    s.GetRequiredService <ISchemaRetrieverFactory>(),
                    s.GetRequiredService <IConnectionDetails>().DefaultDatabaseName));

            services.AddTransient <IResponseParser, KustoResponseParser>(
                s => new KustoResponseParser(
                    s.GetRequiredService <ILogger <KustoResponseParser> >(),
                    bool.Parse((Configuration as IConfigurationRoot)["outputBackendQuery"]),
                    s.GetRequiredService <Telemetry.Metrics>()));

            // use this http client factory to issue requests to the metadata elastic instance
            services.AddHttpClient(MetadataController.ElasticMetadataClientName, (svcProvider, elasticClient) =>
            {
                var metadataConnectionDetails = svcProvider.GetRequiredService <MetadataConnectionDetails>();
                elasticClient.BaseAddress     = new Uri(metadataConnectionDetails.MetadataEndpoint);
            });

            // Add a health/liveness service
            services.AddHealthChecks();

            // required on ASP.NET Core 3 https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-2.2&tabs=visual-studio#jsonnet-support
            services.AddMvcCore().AddNewtonsoftJson();
        }