#
# 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.
#

# Log level
logging.level.root=info

spring.datasource.druid.url=jdbc:mysql://127.0.0.1:3306/apache_inlong_manager?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&nullCatalogMeansCurrent=true&serverTimezone=GMT%2b8
spring.datasource.druid.username=root
spring.datasource.druid.password=inlong
# datasource config, set org.postgresql.Driver if using PostgreSQL
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.druid.validationQuery=SELECT 'x'
# Initialization size, minimum, maximum
spring.datasource.druid.initialSize=20
spring.datasource.druid.minIdle=20
spring.datasource.druid.maxActive=300
# Configure the timeout period to wait for the connection to be acquired
spring.datasource.druid.maxWait=600000
# Configure the minimum survival time of a connection in the pool, in milliseconds
spring.datasource.druid.minEvictableIdleTimeMillis=3600000
# Detect when applying for connection. It is recommended to configure it to true, which does not affect performance and ensures safety
spring.datasource.druid.testWhileIdle=true
# Perform detection when obtaining a connection, it is recommended to close it, which affects performance
spring.datasource.druid.testOnBorrow=false
# Perform detection when returning the connection, it is recommended to close it, which affects performance
spring.datasource.druid.testOnReturn=false
# Configure filters for monitoring statistics interception, stat:monitoring statistics, log4j:log, wall:defense against SQL injection
spring.datasource.druid.filters=stat,wall
# Open the mergeSql function through the connectProperties property, Slow SQL records
spring.datasource.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# Exclude ElasticsearchRestClientAutoConfiguration
spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration

# Audit configuration
# Audit query source that decide what data source to query, currently only supports [MYSQL|ELASTICSEARCH]
audit.query.source=MYSQL

# Elasticsearch config
# Elasticsearch host split by coma if more than one host, such as 'host1,host2'
es.index.search.hostname=127.0.0.1
# Elasticsearch port
es.index.search.port=9200
# Elasticsearch support authentication flag
es.auth.enable=false
# Elasticsearch user of authentication info
es.auth.user=admin
# Elasticsearch password of authentication info
es.auth.password=inlong
