# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The list of logs
type Logs {
    logs: [Log!]!
    total: Int!
}

# Log info
type Log {
    serviceName: String
    serviceId: ID
    serviceInstanceName: String
    serviceInstanceId: ID
    endpointName: String
    endpointId: ID
    traceId: String
    timestamp: Long!
    contentType: ContentType!
    content: String
    tags: [KeyValue!]
}

# Represent the conditions used for query logs
input LogQueryCondition {
    # The value of 0 means all services.
    serviceId: ID
    serviceInstanceId: ID
    endpointId: ID
    # Related trace condition.
    # When use related trace condition, duration is not required.
    relatedTrace: TraceScopeCondition
    # The time range of log happened
    # [Required] duration is required in most query, only exception is when use relatedTrace.
    queryDuration: Duration
    paging: Pagination!
    tags: [LogTag!]
    # Fuzzy query conditions for the log content.
    # Use these 2 keyword related condition, when supportQueryLogsByKeywords returns TRUE.
    keywordsOfContent: [String!]
    excludingKeywordsOfContent: [String!]
    # Order by timestamp, default desc
    queryOrder: Order
}

# Trace related condition
input TraceScopeCondition {
    traceId: String!
    segmentId: String
    spanId: Int
}

input LogTag {
    key: String!
    value: String
}

enum ContentType {
    TEXT
    JSON
    YAML
}

input LogTestRequest {
    # The log data of protocol https://github.com/apache/skywalking-data-collect-protocol/blob/e626ee04850703c220f64b642d2893fa65572943/logging/Logging.proto#41
    # in JSON format
    log: String!
    dsl: String!
}

type LogTestResponse {
    # The final log if it will be persisted, this can be empty if the log is dropped.
    log: Log
    # The metrics generated during the LAL when testing a LogTestRequest
    metrics: [LogTestMetrics!]
}

# The metrics generated during the LAL when testing a LogTestRequest
type LogTestMetrics {
    name: String!
    tags: [KeyValue!]
    value: Long!
    timestamp: Long!
}

extend type Query {
    # Return true if the current storage implementation supports fuzzy query for logs.
    supportQueryLogsByKeywords: Boolean!
    queryLogs(condition: LogQueryCondition): Logs

    # Test the logs and get the results of the LAL output.
    test(requests: LogTestRequest!): LogTestResponse!
}
