提交 4c9758f7 编写于 作者: 如梦技术's avatar 如梦技术 🐛

完善 mica-prometheus 模块。

上级 199bd8fc
......@@ -34,6 +34,7 @@ dependencyManagement {
dependency "net.dreamlu:mica-jetcache:${VERSION}"
dependency "net.dreamlu:mica-lite:${VERSION}"
dependency "net.dreamlu:mica-activerecord:${VERSION}"
dependency "net.dreamlu:mica-prometheus:${VERSION}"
// commons
dependency "com.google.code.findbugs:jsr305:${findbugsVersion}"
dependency "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
......
......@@ -17,3 +17,15 @@
```groovy
compile("net.dreamlu:mica-prometheus:${version}")
```
## 使用
```yaml
- job_name: micax-cloud
honor_timestamps: true
scrape_interval: 15s
scrape_timeout: 10s
metrics_path: /actuator/prometheus
scheme: http
http_sd_configs:
- url: 'http://{ip}:{port}/actuator/prometheus/sd'
```
dependencies {
implementation "org.springframework.boot:spring-boot-actuator-autoconfigure"
api "org.springframework.boot:spring-boot-starter"
api "org.springframework.cloud:spring-cloud-commons"
compileOnly "org.springframework:spring-web"
compileOnly "org.springframework:spring-webflux"
compileOnly "net.dreamlu:mica-auto:${micaAutoVersion}"
annotationProcessor "net.dreamlu:mica-auto:${micaAutoVersion}"
}
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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.
*/
package net.dreamlu.mica.prometheus.sd;
import lombok.RequiredArgsConstructor;
import net.dreamlu.mica.auto.annotation.AutoIgnore;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
/**
* prometheus http sd
*
* @author L.cm
*/
@AutoIgnore
@RestController
@RequestMapping("actuator/prometheus")
@RequiredArgsConstructor
public class PrometheusApi {
private final DiscoveryClient discoveryClient;
@GetMapping("sd")
public List<TargetGroup> getList() {
List<String> serviceIdList = discoveryClient.getServices();
if (serviceIdList == null || serviceIdList.isEmpty()) {
return Collections.emptyList();
}
List<TargetGroup> targetGroupList = new ArrayList<>();
for (String serviceId : serviceIdList) {
List<ServiceInstance> instanceList = discoveryClient.getInstances(serviceId);
List<String> targets = new ArrayList<>();
for (ServiceInstance instance : instanceList) {
targets.add(String.format("%s:%d", instance.getHost(), instance.getPort()));
}
Map<String, String> labels = new HashMap<>(2);
labels.put("__meta_prometheus_job", serviceId);
targetGroupList.add(new TargetGroup(targets, labels));
}
return targetGroupList;
}
}
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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.
*/
package net.dreamlu.mica.prometheus.sd;
import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* prometheus http sd
*
* @author L.cm
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnBlockingDiscoveryEnabled
public class PrometheusConfiguration {
@Bean
public PrometheusApi prometheusApi(DiscoveryClient discoveryClient) {
return new PrometheusApi(discoveryClient);
}
}
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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.
*/
package net.dreamlu.mica.prometheus.sd;
import lombok.RequiredArgsConstructor;
import net.dreamlu.mica.auto.annotation.AutoIgnore;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
/**
* prometheus http sd
*
* @author L.cm
*/
@AutoIgnore
@RestController
@RequestMapping("actuator/prometheus")
@RequiredArgsConstructor
public class ReactivePrometheusApi {
private final ReactiveDiscoveryClient discoveryClient;
@GetMapping("sd")
public Flux<TargetGroup> getList() {
return discoveryClient.getServices()
.flatMap(discoveryClient::getInstances)
.groupBy(ServiceInstance::getServiceId, (instance) ->
String.format("%s:%d", instance.getHost(), instance.getPort())
).flatMap(instanceGrouped -> {
Map<String, String> labels = new HashMap<>(2);
String serviceId = instanceGrouped.key();
labels.put("__meta_prometheus_job", serviceId);
return instanceGrouped.collect(Collectors.toList()).map(targets -> new TargetGroup(targets, labels));
});
}
}
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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.
*/
package net.dreamlu.mica.prometheus.sd;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
import org.springframework.cloud.client.discovery.ReactiveDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* prometheus http sd
*
* @author L.cm
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnReactiveDiscoveryEnabled
public class ReactivePrometheusConfiguration {
@Bean
public ReactivePrometheusApi prometheusApi(ReactiveDiscoveryClient discoveryClient) {
return new ReactivePrometheusApi(discoveryClient);
}
}
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & www.dreamlu.net).
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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.
*/
package net.dreamlu.mica.prometheus.sd;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* prometheus http sd 模型
*
* @author L.cm
*/
@Getter
@RequiredArgsConstructor
public class TargetGroup {
private final List<String> targets;
private final Map<String, String> labels;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册