// Licensed to 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. Apache Software Foundation (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.

// Code generated by go-bindata. DO NOT EDIT.
// sources:
// cr/oap.yaml (942B)
// cr/ui.yaml (935B)
// graphqls/dependency/EndpointDependency.graphql (1.207kB)
// graphqls/event/events.graphql (1.256kB)
// graphqls/healthcheck/healthcheck.graphql (870B)
// graphqls/logs/Logs.graphql (1.258kB)
// graphqls/metadata/AllServices.graphql (911B)
// graphqls/metadata/Instances.graphql (1.069kB)
// graphqls/metadata/SearchEndpoints.graphql (975B)
// graphqls/metadata/SearchService.graphql (930B)
// graphqls/metadata/ServerTimeInfo.graphql (883B)
// graphqls/metrics/HeatMap.graphql (1.067kB)
// graphqls/metrics/LabeledMetricsValues.graphql (1.095kB)
// graphqls/metrics/ListMetrics.graphql (923B)
// graphqls/metrics/MetricsValue.graphql (943B)
// graphqls/metrics/MetricsValues.graphql (1.05kB)
// graphqls/metrics/SortMetrics.graphql (969B)
// graphqls/profile/CreateTask.graphql (971B)
// graphqls/profile/GetProfileAnalyze.graphql (1.16kB)
// graphqls/profile/GetProfiledSegment.graphql (1.199kB)
// graphqls/profile/GetTaskList.graphql (1.211kB)
// graphqls/profile/GetTaskSegmentList.graphql (1.001kB)
// graphqls/trace/Trace.graphql (1.518kB)
// graphqls/trace/Traces.graphql (1.077kB)
// templates/dashboard/global.yml (3.001kB)

package assets

import (
	"crypto/sha256"
	"fmt"
	"io/ioutil"
	"os"
	"path/filepath"
	"strings"
	"time"
)

type asset struct {
	bytes  []byte
	info   os.FileInfo
	digest [sha256.Size]byte
}

type bindataFileInfo struct {
	name    string
	size    int64
	mode    os.FileMode
	modTime time.Time
}

func (fi bindataFileInfo) Name() string {
	return fi.name
}
func (fi bindataFileInfo) Size() int64 {
	return fi.size
}
func (fi bindataFileInfo) Mode() os.FileMode {
	return fi.mode
}
func (fi bindataFileInfo) ModTime() time.Time {
	return fi.modTime
}
func (fi bindataFileInfo) IsDir() bool {
	return false
}
func (fi bindataFileInfo) Sys() interface{} {
	return nil
}

var _crOapYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.

apiVersion: operator.skywalking.apache.org/v1alpha1
kind: OAPServer
metadata:
  name: skywalking
spec:
  version: 8.3.0
  instances: 1
 `)

func crOapYamlBytes() ([]byte, error) {
	return _crOapYaml, nil
}

func crOapYaml() (*asset, error) {
	bytes, err := crOapYamlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "cr/oap.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xb1, 0xd1, 0x17, 0xf7, 0xde, 0x69, 0x4c, 0x3, 0xab, 0x7a, 0x1f, 0x98, 0x8e, 0x9e, 0x5e, 0xa8, 0x60, 0x5e, 0xe4, 0xe8, 0x79, 0xac, 0x65, 0x2f, 0x73, 0x5b, 0xb1, 0xc1, 0xf5, 0x9a, 0x14, 0x80}}
	return a, nil
}

var _crUiYaml = []byte(`# Licensed to 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. Apache Software Foundation (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.

apiVersion: operator.skywalking.apache.org/v1alpha1
kind: UI
metadata:
  name: skywalking
spec:
  version: 8.3.0
  instances: 1
 `)

func crUiYamlBytes() ([]byte, error) {
	return _crUiYaml, nil
}

func crUiYaml() (*asset, error) {
	bytes, err := crUiYamlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "cr/ui.yaml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdc, 0x65, 0xbc, 0x6, 0xf6, 0x0, 0x70, 0x4d, 0xcc, 0x9f, 0x9e, 0xea, 0x1b, 0x5d, 0xee, 0xcd, 0x95, 0x5b, 0xf2, 0xdf, 0xe7, 0x76, 0xb4, 0x36, 0x96, 0x98, 0x2, 0xa1, 0x8e, 0x2f, 0x27, 0x60}}
	return a, nil
}

var _graphqlsDependencyEndpointdependencyGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($endpointId:ID!, $duration: Duration!) {
    result: getEndpointDependencies(duration: $duration, endpointId: $endpointId) {
        nodes {
            id
            name
            serviceId
            serviceName
            type         
            isReal
        }
        calls {
            id
            source
            target
            detectPoints
        }        
    }
}
`)

func graphqlsDependencyEndpointdependencyGraphqlBytes() ([]byte, error) {
	return _graphqlsDependencyEndpointdependencyGraphql, nil
}

func graphqlsDependencyEndpointdependencyGraphql() (*asset, error) {
	bytes, err := graphqlsDependencyEndpointdependencyGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/dependency/EndpointDependency.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xed, 0x55, 0x1, 0xe5, 0x9f, 0x2d, 0xaf, 0xe1, 0xad, 0x20, 0xc5, 0xa2, 0xaa, 0x16, 0x1, 0xca, 0xe3, 0xbf, 0x54, 0x54, 0x4a, 0x9d, 0xa6, 0x69, 0x37, 0x8a, 0xa8, 0x1a, 0xe5, 0xed, 0x28, 0xf}}
	return a, nil
}

var _graphqlsEventEventsGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: EventQueryCondition) {
    result: queryEvents(condition: $condition) {
        total
        events {
            uuid
            source {
                service
                serviceInstance
                endpoint
            }
            name
            type
            message
            parameters {
                key
                value
            }
            startTime
            endTime
        }
    }
}
`)

func graphqlsEventEventsGraphqlBytes() ([]byte, error) {
	return _graphqlsEventEventsGraphql, nil
}

func graphqlsEventEventsGraphql() (*asset, error) {
	bytes, err := graphqlsEventEventsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/event/events.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa6, 0x9f, 0x9e, 0xdc, 0x33, 0x45, 0xfe, 0x28, 0x85, 0x6, 0xcf, 0x2b, 0xde, 0xac, 0x21, 0x70, 0x5b, 0xb6, 0x1, 0xaf, 0x21, 0x93, 0x9, 0x95, 0x43, 0x5e, 0xb3, 0x23, 0xc0, 0xc8, 0x93, 0x2e}}
	return a, nil
}

var _graphqlsHealthcheckHealthcheckGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query {
    checkHealth {
        score
        details
    }
}
`)

func graphqlsHealthcheckHealthcheckGraphqlBytes() ([]byte, error) {
	return _graphqlsHealthcheckHealthcheckGraphql, nil
}

func graphqlsHealthcheckHealthcheckGraphql() (*asset, error) {
	bytes, err := graphqlsHealthcheckHealthcheckGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/healthcheck/healthcheck.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xc0, 0x71, 0x53, 0x13, 0xd0, 0x51, 0xd7, 0x12, 0xd1, 0xed, 0xd9, 0x34, 0x17, 0xef, 0x22, 0xf8, 0xa0, 0xa2, 0x35, 0x57, 0xb, 0x54, 0x6d, 0x5a, 0xb1, 0x8f, 0xbd, 0xb3, 0x40, 0x34, 0xc2, 0x2d}}
	return a, nil
}

var _graphqlsLogsLogsGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: LogQueryCondition!) {
    result: queryLogs(condition: $condition) {
        total
        logs {
            serviceName
            serviceId
            serviceInstanceName
            serviceInstanceId
            endpointName
            endpointId
            traceId
            timestamp
            contentType
            content
            tags {
                key
                value
            }
        }
    }
}
`)

func graphqlsLogsLogsGraphqlBytes() ([]byte, error) {
	return _graphqlsLogsLogsGraphql, nil
}

func graphqlsLogsLogsGraphql() (*asset, error) {
	bytes, err := graphqlsLogsLogsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/logs/Logs.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5, 0xb, 0x5c, 0x60, 0x9b, 0x18, 0x98, 0xa0, 0xdd, 0x60, 0x42, 0x91, 0x53, 0x25, 0xcd, 0x59, 0xa5, 0x1c, 0xff, 0xc3, 0xf7, 0xf0, 0x45, 0xb3, 0xf7, 0xcd, 0xd8, 0x63, 0xee, 0x9f, 0x6a, 0x3a}}
	return a, nil
}

var _graphqlsMetadataAllservicesGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($duration: Duration!) {
    result: getAllServices(duration: $duration) {
        id name
    }
}
`)

func graphqlsMetadataAllservicesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataAllservicesGraphql, nil
}

func graphqlsMetadataAllservicesGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataAllservicesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/AllServices.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa1, 0xe0, 0xdf, 0xca, 0xb7, 0xa1, 0xbb, 0x88, 0x28, 0x9b, 0x49, 0x2a, 0x19, 0x51, 0xfc, 0xec, 0xab, 0x17, 0x36, 0xb6, 0x33, 0x17, 0x87, 0xd1, 0xd1, 0x98, 0xd, 0x5, 0xc5, 0x82, 0x82, 0xed}}
	return a, nil
}

var _graphqlsMetadataInstancesGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.


query ($serviceId: ID!, $duration: Duration!) {
    result: getServiceInstances(duration: $duration, serviceId: $serviceId) {
        id
        name
        language
        instanceUUID
        attributes {
            name
            value
        }
    }
}
`)

func graphqlsMetadataInstancesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataInstancesGraphql, nil
}

func graphqlsMetadataInstancesGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataInstancesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/Instances.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x98, 0xdb, 0x11, 0xad, 0x8f, 0x96, 0x8c, 0xf0, 0xf, 0x63, 0x2e, 0x35, 0x83, 0xe5, 0xb9, 0x81, 0xe8, 0x79, 0x98, 0x5d, 0xb, 0xec, 0xc7, 0xdf, 0x67, 0x7b, 0x6e, 0x3f, 0xe3, 0x4, 0x80, 0x9e}}
	return a, nil
}

var _graphqlsMetadataSearchendpointsGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($keyword: String!, $serviceId: ID!, $limit: Int!) {
    result: searchEndpoint(keyword: $keyword, serviceId: $serviceId, limit: $limit) {
        id name
    }
}
`)

func graphqlsMetadataSearchendpointsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataSearchendpointsGraphql, nil
}

func graphqlsMetadataSearchendpointsGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataSearchendpointsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/SearchEndpoints.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xdb, 0x8b, 0xad, 0xa0, 0x77, 0x43, 0x29, 0x8e, 0x6a, 0x7d, 0x1a, 0x68, 0x73, 0x66, 0x26, 0xe2, 0x66, 0xe3, 0xe3, 0xde, 0xca, 0xb5, 0x7, 0x8e, 0xf8, 0xd2, 0x62, 0x9a, 0x91, 0x3a, 0xab, 0xc9}}
	return a, nil
}

var _graphqlsMetadataSearchserviceGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query searchService($serviceCode: String!) {
    result: searchService(serviceCode: $serviceCode) {
        id name
    }
}
`)

func graphqlsMetadataSearchserviceGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataSearchserviceGraphql, nil
}

func graphqlsMetadataSearchserviceGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataSearchserviceGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/SearchService.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xba, 0x2b, 0x8e, 0x55, 0x40, 0xf3, 0x8e, 0x89, 0x6f, 0x60, 0xff, 0x64, 0x51, 0xe5, 0xe5, 0x63, 0xc4, 0xe2, 0x78, 0x91, 0x39, 0xb6, 0x59, 0x3f, 0x31, 0xb5, 0xe4, 0x47, 0xbc, 0xa6, 0xd6, 0xd2}}
	return a, nil
}

var _graphqlsMetadataServertimeinfoGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query {
    result: getTimeInfo {
        timezone, currentTimestamp
    }
}
`)

func graphqlsMetadataServertimeinfoGraphqlBytes() ([]byte, error) {
	return _graphqlsMetadataServertimeinfoGraphql, nil
}

func graphqlsMetadataServertimeinfoGraphql() (*asset, error) {
	bytes, err := graphqlsMetadataServertimeinfoGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metadata/ServerTimeInfo.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x38, 0xa2, 0xfb, 0x31, 0x64, 0x77, 0xd0, 0x20, 0xc1, 0x6b, 0xac, 0x8e, 0x2e, 0x8b, 0xf7, 0x89, 0x4b, 0x7b, 0xe8, 0xbb, 0x7e, 0x90, 0x76, 0x35, 0xc8, 0xb1, 0x5e, 0xad, 0x9a, 0xd2, 0x2c, 0x1c}}
	return a, nil
}

var _graphqlsMetricsHeatmapGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readHeatMap(condition: $condition, duration: $duration) {
        values {
            id
            values
        }
        buckets {
            min
            max
        }
    }
}
`)

func graphqlsMetricsHeatmapGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsHeatmapGraphql, nil
}

func graphqlsMetricsHeatmapGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsHeatmapGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/HeatMap.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4f, 0x41, 0x5d, 0xdd, 0xfa, 0x49, 0x96, 0x85, 0xc8, 0x61, 0x79, 0x12, 0xcb, 0xa3, 0x4d, 0x45, 0x66, 0x7f, 0x9f, 0x2c, 0x4c, 0xbd, 0xb3, 0xf3, 0xe8, 0x58, 0x3, 0xec, 0x1f, 0x4e, 0x5b, 0xde}}
	return a, nil
}

var _graphqlsMetricsLabeledmetricsvaluesGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: MetricsCondition!, $labels: [String!]!, $duration: Duration!) {
    result: readLabeledMetricsValues(condition: $condition, labels: $labels, duration: $duration) {
        label
        values {
            values {
                value
            }
        }
    }
}
`)

func graphqlsMetricsLabeledmetricsvaluesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsLabeledmetricsvaluesGraphql, nil
}

func graphqlsMetricsLabeledmetricsvaluesGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsLabeledmetricsvaluesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/LabeledMetricsValues.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x74, 0xca, 0xe6, 0xdb, 0x5e, 0x7d, 0x34, 0x8c, 0x8c, 0x33, 0x2d, 0xe9, 0xe3, 0x40, 0xd8, 0x5c, 0xfc, 0xe, 0x76, 0x53, 0x31, 0xac, 0x4e, 0xb4, 0x60, 0x93, 0x4b, 0xca, 0x8a, 0x1a, 0xa7, 0xc1}}
	return a, nil
}

var _graphqlsMetricsListmetricsGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($regex: String!) {
    result: listMetrics(regex: $regex) {
        name
        type
        catalog
    }
}
`)

func graphqlsMetricsListmetricsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsListmetricsGraphql, nil
}

func graphqlsMetricsListmetricsGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsListmetricsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/ListMetrics.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x48, 0x1c, 0x96, 0x32, 0x29, 0x80, 0x57, 0x43, 0x83, 0xc2, 0xd3, 0xd8, 0x48, 0xaf, 0x14, 0x43, 0xd, 0xc6, 0x67, 0x3a, 0x83, 0x66, 0xf, 0xaa, 0x6b, 0xd5, 0xff, 0x85, 0x1, 0x2f, 0x49, 0xdf}}
	return a, nil
}

var _graphqlsMetricsMetricsvalueGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readMetricsValue(condition: $condition, duration: $duration)
}
`)

func graphqlsMetricsMetricsvalueGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsMetricsvalueGraphql, nil
}

func graphqlsMetricsMetricsvalueGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsMetricsvalueGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/MetricsValue.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5, 0xe, 0xee, 0xbc, 0xfa, 0xbe, 0x4, 0x85, 0xb9, 0x48, 0x6a, 0xda, 0x12, 0x14, 0x77, 0xe4, 0x6d, 0x34, 0x83, 0x79, 0x28, 0x30, 0x7e, 0xf, 0xe3, 0xa5, 0xe5, 0xd8, 0x11, 0x51, 0xa2, 0xfe}}
	return a, nil
}

var _graphqlsMetricsMetricsvaluesGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: MetricsCondition!, $duration: Duration!) {
    result: readMetricsValues(condition: $condition, duration: $duration) {
        label
        values {
            values {
                value
            }
        }
    }
}
`)

func graphqlsMetricsMetricsvaluesGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsMetricsvaluesGraphql, nil
}

func graphqlsMetricsMetricsvaluesGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsMetricsvaluesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/MetricsValues.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x9c, 0xc9, 0x71, 0xb6, 0xab, 0x2, 0x23, 0x2f, 0x1b, 0x73, 0xe1, 0xd1, 0x6d, 0xa1, 0x5e, 0xb4, 0xb1, 0xc4, 0x6e, 0xdb, 0x22, 0x7b, 0x68, 0x49, 0x76, 0x1b, 0x8, 0x64, 0xae, 0x15, 0x70, 0xbd}}
	return a, nil
}

var _graphqlsMetricsSortmetricsGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition:TopNCondition!, $duration: Duration!) {
    result: sortMetrics(condition: $condition, duration: $duration) {
        name
        value
    }
}
`)

func graphqlsMetricsSortmetricsGraphqlBytes() ([]byte, error) {
	return _graphqlsMetricsSortmetricsGraphql, nil
}

func graphqlsMetricsSortmetricsGraphql() (*asset, error) {
	bytes, err := graphqlsMetricsSortmetricsGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/metrics/SortMetrics.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x5b, 0xfc, 0xe0, 0x9, 0x92, 0xe3, 0xe5, 0x24, 0x29, 0x7c, 0x4c, 0x8e, 0xe6, 0x2d, 0x54, 0xb0, 0x34, 0xcd, 0x2a, 0x82, 0xd, 0x4e, 0xa9, 0xed, 0x51, 0x64, 0x77, 0x52, 0xbf, 0x48, 0x6f, 0x7a}}
	return a, nil
}

var _graphqlsProfileCreatetaskGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

mutation ($condition: ProfileTaskCreationRequest) {
    result: createProfileTask(creationRequest: $condition) {
      errorReason: errorReason
      id: id
    }
}
`)

func graphqlsProfileCreatetaskGraphqlBytes() ([]byte, error) {
	return _graphqlsProfileCreatetaskGraphql, nil
}

func graphqlsProfileCreatetaskGraphql() (*asset, error) {
	bytes, err := graphqlsProfileCreatetaskGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/profile/CreateTask.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4f, 0xcc, 0x41, 0xa2, 0xe6, 0x43, 0x55, 0xfb, 0x37, 0x34, 0x52, 0x74, 0x8c, 0xf3, 0x96, 0x2d, 0x14, 0x43, 0x5e, 0x3c, 0x5a, 0xf1, 0xc2, 0x3b, 0x45, 0xaf, 0xf2, 0xd2, 0xb, 0xbe, 0x38, 0xaf}}
	return a, nil
}

var _graphqlsProfileGetprofileanalyzeGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($segmentId: String!, $timeRanges: [ProfileAnalyzeTimeRange!]!) {
    result: getProfileAnalyze(segmentId: $segmentId, timeRanges: $timeRanges) {
        trees {
    		elements {
              id
              parentId
              codeSignature
              duration
              durationChildExcluded
              count
    		}
    	}
    }
}`)

func graphqlsProfileGetprofileanalyzeGraphqlBytes() ([]byte, error) {
	return _graphqlsProfileGetprofileanalyzeGraphql, nil
}

func graphqlsProfileGetprofileanalyzeGraphql() (*asset, error) {
	bytes, err := graphqlsProfileGetprofileanalyzeGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/profile/GetProfileAnalyze.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xa0, 0x24, 0x39, 0x6d, 0x3b, 0x8e, 0x62, 0x8, 0xb, 0xec, 0xa6, 0xa9, 0x51, 0xc8, 0x8a, 0x4, 0xf7, 0x7a, 0x58, 0x1d, 0xf2, 0x6c, 0x5a, 0x1e, 0x8d, 0x8a, 0x87, 0x18, 0xda, 0xc5, 0xe7, 0xe7}}
	return a, nil
}

var _graphqlsProfileGetprofiledsegmentGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($segmentId: String!) {
    result: getProfiledSegment(segmentId: $segmentId) {
        spans {
           spanId
           parentSpanId
           serviceCode
           startTime
           endTime
           endpointName
           type
           peer
           component
           isError
           layer
           tags {
               key value
           }
        }
    }
}`)

func graphqlsProfileGetprofiledsegmentGraphqlBytes() ([]byte, error) {
	return _graphqlsProfileGetprofiledsegmentGraphql, nil
}

func graphqlsProfileGetprofiledsegmentGraphql() (*asset, error) {
	bytes, err := graphqlsProfileGetprofiledsegmentGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/profile/GetProfiledSegment.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4b, 0x91, 0x47, 0x18, 0x20, 0x4b, 0x3f, 0x67, 0xfc, 0x9b, 0x4b, 0xfc, 0x95, 0xf8, 0xe8, 0x5a, 0x5f, 0x5c, 0x81, 0x7d, 0xb1, 0x27, 0xb9, 0x89, 0xf4, 0xc0, 0xfd, 0x4f, 0x1e, 0x5b, 0x69, 0xa5}}
	return a, nil
}

var _graphqlsProfileGettasklistGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($serviceId: ID, $endpointName: String) {
    result: getProfileTaskList(serviceId: $serviceId, endpointName: $endpointName) {
        id
        serviceId
        endpointName
        startTime
        duration
        minDurationThreshold
        dumpPeriod
        maxSamplingCount
        logs {
          id
          instanceId
          operationType
          operationTime
        }
    }
}`)

func graphqlsProfileGettasklistGraphqlBytes() ([]byte, error) {
	return _graphqlsProfileGettasklistGraphql, nil
}

func graphqlsProfileGettasklistGraphql() (*asset, error) {
	bytes, err := graphqlsProfileGettasklistGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/profile/GetTaskList.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x87, 0xe0, 0x1c, 0x5a, 0x5, 0x9c, 0x4a, 0xf7, 0xce, 0x2f, 0x91, 0x6a, 0x2f, 0x5d, 0x9a, 0x7, 0x15, 0xf6, 0xa3, 0x5a, 0x50, 0x40, 0xff, 0x71, 0xfc, 0xde, 0xa7, 0x91, 0x13, 0x77, 0xca, 0xc2}}
	return a, nil
}

var _graphqlsProfileGettasksegmentlistGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($taskId: String!) {
    result: getProfileTaskSegmentList(taskID: $taskId) {
        segmentId
        endpointNames
        duration
        start
        isError
        traceIds
    }
}`)

func graphqlsProfileGettasksegmentlistGraphqlBytes() ([]byte, error) {
	return _graphqlsProfileGettasksegmentlistGraphql, nil
}

func graphqlsProfileGettasksegmentlistGraphql() (*asset, error) {
	bytes, err := graphqlsProfileGettasksegmentlistGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/profile/GetTaskSegmentList.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xd5, 0xaf, 0xab, 0xf5, 0x2, 0x57, 0xbe, 0x94, 0x9, 0x3f, 0xae, 0x9, 0x51, 0xf3, 0xd6, 0x9b, 0x72, 0x70, 0xc2, 0xba, 0xf7, 0x6c, 0xac, 0x8f, 0x1a, 0x4c, 0xf, 0x28, 0x3e, 0x94, 0x8f, 0x8d}}
	return a, nil
}

var _graphqlsTraceTraceGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($traceId: ID!) {
    result: queryTrace(traceId: $traceId) {
        spans {
            traceId
            segmentId
            spanId
            parentSpanId
            refs {
                traceId
                parentSegmentId
                parentSpanId
                type
            }
            serviceCode
            serviceInstanceName
            startTime
            endTime
            endpointName
            type
            peer
            component
            isError
            layer
            tags {
                key value
            }
            logs {
                time data {
                    key value
                }
            }
        }
    }
}
`)

func graphqlsTraceTraceGraphqlBytes() ([]byte, error) {
	return _graphqlsTraceTraceGraphql, nil
}

func graphqlsTraceTraceGraphql() (*asset, error) {
	bytes, err := graphqlsTraceTraceGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/trace/Trace.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x4f, 0x37, 0xaa, 0xc4, 0x71, 0x9f, 0x64, 0xfa, 0xf, 0x97, 0x8c, 0x5a, 0x6c, 0xe8, 0x94, 0xd2, 0x2d, 0x69, 0xbb, 0xbf, 0xf2, 0x1b, 0x3d, 0x11, 0xf3, 0x63, 0xba, 0xc3, 0x16, 0x2a, 0xca, 0xd7}}
	return a, nil
}

var _graphqlsTraceTracesGraphql = []byte(`# Licensed to 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. Apache Software Foundation (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.

query ($condition: TraceQueryCondition!){
    result: queryBasicTraces(condition: $condition){
        total
        traces {
            segmentId
            endpointNames
            duration
            start
            isError
            traceIds
        }
    }
}`)

func graphqlsTraceTracesGraphqlBytes() ([]byte, error) {
	return _graphqlsTraceTracesGraphql, nil
}

func graphqlsTraceTracesGraphql() (*asset, error) {
	bytes, err := graphqlsTraceTracesGraphqlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "graphqls/trace/Traces.graphql", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0x30, 0xfb, 0x68, 0x9b, 0x61, 0x82, 0x37, 0x55, 0x87, 0x27, 0xcf, 0xd4, 0x39, 0x2b, 0x73, 0xf, 0x11, 0x8, 0x1c, 0x5, 0x78, 0x43, 0xb3, 0x49, 0x88, 0xc1, 0x65, 0x12, 0xf, 0xff, 0x4f, 0x66}}
	return a, nil
}

var _templatesDashboardGlobalYml = []byte(((((`# 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 command ` + ("`" + `dashboard global`)) + (("`" + ` supports displaying three kinds of data:
# `) + ("`" + `global metrics`))) + (("`" + (`, ` + "`")) + ((`global response latency` + "`") + (`, ` + "`")))) + (((`Global heat map` + ("`" + `.
# If you don't want to display an item, you can just delete or comment its whole configuration below.
# Generally, there is no need to modify properties unless there is a explanatory comment.

# Set the style for the dashboard.
style:
  # Xterm colors number, an integer from 0 to 255.
  # Refer to https://jonasjacek.github.io/colors/ to change to other colors.
  buttonColor: 220
  titleColor: 9
  gaugeColor: 13

# The global metrics, there are four kinds of metrics displaying by default.
# Each metric will occupy one column to display.
# Similarly, you can delete or comment corresponding whole configuration to change the metrics to be displayed.
metrics:
  - condition:
      name: "service_cpm"
      normal: true
      scope: "Service"
      # You can modify `)) + (("`" + `topN`) + ("`" + ` to change the amount of results to be displayed, the same below.
      topN: 10
      # You can modify `))) + ((("`" + `order`) + ("`" + ` to `)) + (("`" + `ASC`) + ("`" + ` to display the results in ascending order, the same below.
      order: "DES"
    title: " Service Load (calls/min) "

  - condition:
      name: "service_resp_time"
      normal: true
      scope: "Service"
      topN: 10
      order: "DES"
    title: "    Slow Services (ms)    "

  - condition:
      name: "service_apdex"
      normal: true
      scope: "Service"
      topN: 10
      order: "ASC"
    title: "Un-Health Services (Apdex)"
    # The returned apdex data is integer, like '3115',
    # need to be converted into a number between 0 and 1.
    aggregation: "/"
    aggregationNum: 10000

  - condition:
      name: "endpoint_avg"
      normal: true
      scope: "Endpoint"
      topN: 10
      order: "DES"
    title: "    Slow Endpoints (ms)   "

# Global response latency.
responseLatency:
  condition:
    name: "all_percentile"
    entity:
      scope: "All"
      normal: true
  labels: "P50, P75, P90, P95, P99"
  labelsIndex: "0, 1, 2, 3, 4"
  title: "Global Response Latency"
  unit: "percentile in ms"

# Global heat map.
heatMap:
  condition:
    name: "all_heatmap"
    entity:
      scope: "All"
      normal: true
  title: "Global Heatmap"
  unit: "ms"`))))))

func templatesDashboardGlobalYmlBytes() ([]byte, error) {
	return _templatesDashboardGlobalYml, nil
}

func templatesDashboardGlobalYml() (*asset, error) {
	bytes, err := templatesDashboardGlobalYmlBytes()
	if err != nil {
		return nil, err
	}

	info := bindataFileInfo{name: "templates/dashboard/global.yml", size: 0, mode: os.FileMode(0), modTime: time.Unix(0, 0)}
	a := &asset{bytes: bytes, info: info, digest: [32]uint8{0xe, 0x46, 0xab, 0x48, 0xaa, 0x2, 0x58, 0xb6, 0x2b, 0x28, 0x5c, 0xee, 0x7e, 0x5d, 0x77, 0xfb, 0xce, 0x6d, 0x6b, 0x6d, 0xa9, 0xde, 0xed, 0xed, 0x60, 0x9a, 0xfe, 0x47, 0xca, 0xea, 0x33, 0x9f}}
	return a, nil
}

// Asset loads and returns the asset for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func Asset(name string) ([]byte, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err)
		}
		return a.bytes, nil
	}
	return nil, fmt.Errorf("Asset %s not found", name)
}

// AssetString returns the asset contents as a string (instead of a []byte).
func AssetString(name string) (string, error) {
	data, err := Asset(name)
	return string(data), err
}

// MustAsset is like Asset but panics when Asset would return an error.
// It simplifies safe initialization of global variables.
func MustAsset(name string) []byte {
	a, err := Asset(name)
	if err != nil {
		panic("asset: Asset(" + name + "): " + err.Error())
	}

	return a
}

// MustAssetString is like AssetString but panics when Asset would return an
// error. It simplifies safe initialization of global variables.
func MustAssetString(name string) string {
	return string(MustAsset(name))
}

// AssetInfo loads and returns the asset info for the given name.
// It returns an error if the asset could not be found or
// could not be loaded.
func AssetInfo(name string) (os.FileInfo, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err)
		}
		return a.info, nil
	}
	return nil, fmt.Errorf("AssetInfo %s not found", name)
}

// AssetDigest returns the digest of the file with the given name. It returns an
// error if the asset could not be found or the digest could not be loaded.
func AssetDigest(name string) ([sha256.Size]byte, error) {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	if f, ok := _bindata[canonicalName]; ok {
		a, err := f()
		if err != nil {
			return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s can't read by error: %v", name, err)
		}
		return a.digest, nil
	}
	return [sha256.Size]byte{}, fmt.Errorf("AssetDigest %s not found", name)
}

// Digests returns a map of all known files and their checksums.
func Digests() (map[string][sha256.Size]byte, error) {
	mp := make(map[string][sha256.Size]byte, len(_bindata))
	for name := range _bindata {
		a, err := _bindata[name]()
		if err != nil {
			return nil, err
		}
		mp[name] = a.digest
	}
	return mp, nil
}

// AssetNames returns the names of the assets.
func AssetNames() []string {
	names := make([]string, 0, len(_bindata))
	for name := range _bindata {
		names = append(names, name)
	}
	return names
}

// _bindata is a table, holding each asset generator, mapped to its name.
var _bindata = map[string]func() (*asset, error){
	"cr/oap.yaml": crOapYaml,
	"cr/ui.yaml":  crUiYaml,
	"graphqls/dependency/EndpointDependency.graphql": graphqlsDependencyEndpointdependencyGraphql,
	"graphqls/event/events.graphql":                  graphqlsEventEventsGraphql,
	"graphqls/healthcheck/healthcheck.graphql":       graphqlsHealthcheckHealthcheckGraphql,
	"graphqls/logs/Logs.graphql":                     graphqlsLogsLogsGraphql,
	"graphqls/metadata/AllServices.graphql":          graphqlsMetadataAllservicesGraphql,
	"graphqls/metadata/Instances.graphql":            graphqlsMetadataInstancesGraphql,
	"graphqls/metadata/SearchEndpoints.graphql":      graphqlsMetadataSearchendpointsGraphql,
	"graphqls/metadata/SearchService.graphql":        graphqlsMetadataSearchserviceGraphql,
	"graphqls/metadata/ServerTimeInfo.graphql":       graphqlsMetadataServertimeinfoGraphql,
	"graphqls/metrics/HeatMap.graphql":               graphqlsMetricsHeatmapGraphql,
	"graphqls/metrics/LabeledMetricsValues.graphql":  graphqlsMetricsLabeledmetricsvaluesGraphql,
	"graphqls/metrics/ListMetrics.graphql":           graphqlsMetricsListmetricsGraphql,
	"graphqls/metrics/MetricsValue.graphql":          graphqlsMetricsMetricsvalueGraphql,
	"graphqls/metrics/MetricsValues.graphql":         graphqlsMetricsMetricsvaluesGraphql,
	"graphqls/metrics/SortMetrics.graphql":           graphqlsMetricsSortmetricsGraphql,
	"graphqls/profile/CreateTask.graphql":            graphqlsProfileCreatetaskGraphql,
	"graphqls/profile/GetProfileAnalyze.graphql":     graphqlsProfileGetprofileanalyzeGraphql,
	"graphqls/profile/GetProfiledSegment.graphql":    graphqlsProfileGetprofiledsegmentGraphql,
	"graphqls/profile/GetTaskList.graphql":           graphqlsProfileGettasklistGraphql,
	"graphqls/profile/GetTaskSegmentList.graphql":    graphqlsProfileGettasksegmentlistGraphql,
	"graphqls/trace/Trace.graphql":                   graphqlsTraceTraceGraphql,
	"graphqls/trace/Traces.graphql":                  graphqlsTraceTracesGraphql,
	"templates/dashboard/global.yml":                 templatesDashboardGlobalYml,
}

// AssetDebug is true if the assets were built with the debug flag enabled.
const AssetDebug = false

// AssetDir returns the file names below a certain
// directory embedded in the file by go-bindata.
// For example if you run go-bindata on data/... and data contains the
// following hierarchy:
//     data/
//       foo.txt
//       img/
//         a.png
//         b.png
// then AssetDir("data") would return []string{"foo.txt", "img"},
// AssetDir("data/img") would return []string{"a.png", "b.png"},
// AssetDir("foo.txt") and AssetDir("notexist") would return an error, and
// AssetDir("") will return []string{"data"}.
func AssetDir(name string) ([]string, error) {
	node := _bintree
	if len(name) != 0 {
		canonicalName := strings.Replace(name, "\\", "/", -1)
		pathList := strings.Split(canonicalName, "/")
		for _, p := range pathList {
			node = node.Children[p]
			if node == nil {
				return nil, fmt.Errorf("Asset %s not found", name)
			}
		}
	}
	if node.Func != nil {
		return nil, fmt.Errorf("Asset %s not found", name)
	}
	rv := make([]string, 0, len(node.Children))
	for childName := range node.Children {
		rv = append(rv, childName)
	}
	return rv, nil
}

type bintree struct {
	Func     func() (*asset, error)
	Children map[string]*bintree
}

var _bintree = &bintree{nil, map[string]*bintree{
	"cr": &bintree{nil, map[string]*bintree{
		"oap.yaml": &bintree{crOapYaml, map[string]*bintree{}},
		"ui.yaml":  &bintree{crUiYaml, map[string]*bintree{}},
	}},
	"graphqls": &bintree{nil, map[string]*bintree{
		"dependency": &bintree{nil, map[string]*bintree{
			"EndpointDependency.graphql": &bintree{graphqlsDependencyEndpointdependencyGraphql, map[string]*bintree{}},
		}},
		"event": &bintree{nil, map[string]*bintree{
			"events.graphql": &bintree{graphqlsEventEventsGraphql, map[string]*bintree{}},
		}},
		"healthcheck": &bintree{nil, map[string]*bintree{
			"healthcheck.graphql": &bintree{graphqlsHealthcheckHealthcheckGraphql, map[string]*bintree{}},
		}},
		"logs": &bintree{nil, map[string]*bintree{
			"Logs.graphql": &bintree{graphqlsLogsLogsGraphql, map[string]*bintree{}},
		}},
		"metadata": &bintree{nil, map[string]*bintree{
			"AllServices.graphql":     &bintree{graphqlsMetadataAllservicesGraphql, map[string]*bintree{}},
			"Instances.graphql":       &bintree{graphqlsMetadataInstancesGraphql, map[string]*bintree{}},
			"SearchEndpoints.graphql": &bintree{graphqlsMetadataSearchendpointsGraphql, map[string]*bintree{}},
			"SearchService.graphql":   &bintree{graphqlsMetadataSearchserviceGraphql, map[string]*bintree{}},
			"ServerTimeInfo.graphql":  &bintree{graphqlsMetadataServertimeinfoGraphql, map[string]*bintree{}},
		}},
		"metrics": &bintree{nil, map[string]*bintree{
			"HeatMap.graphql":              &bintree{graphqlsMetricsHeatmapGraphql, map[string]*bintree{}},
			"LabeledMetricsValues.graphql": &bintree{graphqlsMetricsLabeledmetricsvaluesGraphql, map[string]*bintree{}},
			"ListMetrics.graphql":          &bintree{graphqlsMetricsListmetricsGraphql, map[string]*bintree{}},
			"MetricsValue.graphql":         &bintree{graphqlsMetricsMetricsvalueGraphql, map[string]*bintree{}},
			"MetricsValues.graphql":        &bintree{graphqlsMetricsMetricsvaluesGraphql, map[string]*bintree{}},
			"SortMetrics.graphql":          &bintree{graphqlsMetricsSortmetricsGraphql, map[string]*bintree{}},
		}},
		"profile": &bintree{nil, map[string]*bintree{
			"CreateTask.graphql":         &bintree{graphqlsProfileCreatetaskGraphql, map[string]*bintree{}},
			"GetProfileAnalyze.graphql":  &bintree{graphqlsProfileGetprofileanalyzeGraphql, map[string]*bintree{}},
			"GetProfiledSegment.graphql": &bintree{graphqlsProfileGetprofiledsegmentGraphql, map[string]*bintree{}},
			"GetTaskList.graphql":        &bintree{graphqlsProfileGettasklistGraphql, map[string]*bintree{}},
			"GetTaskSegmentList.graphql": &bintree{graphqlsProfileGettasksegmentlistGraphql, map[string]*bintree{}},
		}},
		"trace": &bintree{nil, map[string]*bintree{
			"Trace.graphql":  &bintree{graphqlsTraceTraceGraphql, map[string]*bintree{}},
			"Traces.graphql": &bintree{graphqlsTraceTracesGraphql, map[string]*bintree{}},
		}},
	}},
	"templates": &bintree{nil, map[string]*bintree{
		"dashboard": &bintree{nil, map[string]*bintree{
			"global.yml": &bintree{templatesDashboardGlobalYml, map[string]*bintree{}},
		}},
	}},
}}

// RestoreAsset restores an asset under the given directory.
func RestoreAsset(dir, name string) error {
	data, err := Asset(name)
	if err != nil {
		return err
	}
	info, err := AssetInfo(name)
	if err != nil {
		return err
	}
	err = os.MkdirAll(_filePath(dir, filepath.Dir(name)), os.FileMode(0755))
	if err != nil {
		return err
	}
	err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode())
	if err != nil {
		return err
	}
	return os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime())
}

// RestoreAssets restores an asset under the given directory recursively.
func RestoreAssets(dir, name string) error {
	children, err := AssetDir(name)
	// File
	if err != nil {
		return RestoreAsset(dir, name)
	}
	// Dir
	for _, child := range children {
		err = RestoreAssets(dir, filepath.Join(name, child))
		if err != nil {
			return err
		}
	}
	return nil
}

func _filePath(dir, name string) string {
	canonicalName := strings.Replace(name, "\\", "/", -1)
	return filepath.Join(append([]string{dir}, strings.Split(canonicalName, "/")...)...)
}
