This is an automated email from the ASF dual-hosted git repository. liubao pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
commit 07e85f0acc2cd7620253103c55d7b5814d0601b9 Author: liubao <[email protected]> AuthorDate: Mon Nov 27 11:57:27 2023 +0800 [SCB-2838]using micrometer to replace spectator part3: OsMeter --- .../foundation/metrics/MetricsBootstrap.java | 6 +++ .../metrics/meter/AbstractPeriodMeter.java | 42 ---------------- .../foundation/metrics/meter/PeriodMeter.java | 2 +- .../metrics/core/OsMetersInitializer.java | 10 +++- .../metrics/core/meter/os/CpuMeter.java | 41 ++++++++-------- .../metrics/core/meter/os/NetMeter.java | 47 ++++++++---------- .../servicecomb/metrics/core/meter/os/OsMeter.java | 28 ++++------- .../core/meter/os/cpu/AbstractCpuUsage.java | 13 ----- .../metrics/core/meter/os/cpu/OsCpuUsage.java | 5 +- .../metrics/core/meter/os/cpu/ProcessCpuUsage.java | 5 +- .../metrics/core/meter/os/net/InterfaceUsage.java | 56 +++++++++++----------- .../metrics/core/meter/os/net/NetStat.java | 11 +---- 12 files changed, 93 insertions(+), 173 deletions(-) diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java index 2521650f6..72be58c9d 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/MetricsBootstrap.java @@ -22,6 +22,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -91,6 +92,11 @@ public class MetricsBootstrap { } public synchronized void pollMeters() { + metricsInitializers.forEach(initializer -> { + if (initializer instanceof PeriodMeter) { + ((PeriodMeter) initializer).poll(System.currentTimeMillis(), config.getMsPollInterval()); + } + }); try { PolledEvent polledEvent = new PolledEvent(meterRegistry.getMeters()); eventBus.post(polledEvent); diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java deleted file mode 100644 index bd8672e5a..000000000 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/AbstractPeriodMeter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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. - */ -package org.apache.servicecomb.foundation.metrics.meter; - -import java.util.Collections; -import java.util.List; - -import io.micrometer.core.instrument.Measurement; - - -public abstract class AbstractPeriodMeter implements PeriodMeter { - protected Id id; - - protected List<Measurement> allMeasurements = Collections.emptyList(); - - public Id id() { - return id; - } - - @Override - public Iterable<Measurement> measure() { - return allMeasurements; - } - - public boolean hasExpired() { - return false; - } -} diff --git a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java index 3fcbf41bd..a846d0817 100644 --- a/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java +++ b/foundations/foundation-metrics/src/main/java/org/apache/servicecomb/foundation/metrics/meter/PeriodMeter.java @@ -17,5 +17,5 @@ package org.apache.servicecomb.foundation.metrics.meter; public interface PeriodMeter { - void calcMeasurements(long msNow, long secondInterval); + void poll(long msNow, long secondInterval); } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java index 03b6660ff..2c5b0e28a 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/OsMetersInitializer.java @@ -19,6 +19,7 @@ package org.apache.servicecomb.metrics.core; import org.apache.commons.lang3.SystemUtils; import org.apache.servicecomb.foundation.metrics.MetricsBootstrapConfig; import org.apache.servicecomb.foundation.metrics.MetricsInitializer; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; import org.apache.servicecomb.metrics.core.meter.os.OsMeter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -28,7 +29,7 @@ import com.google.common.eventbus.EventBus; import io.micrometer.core.instrument.MeterRegistry; -public class OsMetersInitializer implements MetricsInitializer { +public class OsMetersInitializer implements MetricsInitializer, PeriodMeter { private static final Logger LOGGER = LoggerFactory.getLogger(OsMetersInitializer.class); private OsMeter osMeter; @@ -54,4 +55,11 @@ public class OsMetersInitializer implements MetricsInitializer { public OsMeter getOsMeter() { return osMeter; } + + @Override + public void poll(long msNow, long secondInterval) { + if (osMeter != null) { + osMeter.poll(msNow, secondInterval); + } + } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java index fdc7e8022..f7d7f83b2 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/CpuMeter.java @@ -16,20 +16,21 @@ */ package org.apache.servicecomb.metrics.core.meter.os; -import java.util.List; +import java.io.IOException; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; import org.apache.servicecomb.metrics.core.meter.os.cpu.OsCpuUsage; import org.apache.servicecomb.metrics.core.meter.os.cpu.ProcessCpuUsage; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.micrometer.core.instrument.Measurement; -import io.micrometer.core.instrument.Meter.Id; -import io.micrometer.core.instrument.Statistic; -import io.micrometer.core.instrument.Tag; +import com.google.common.annotations.VisibleForTesting; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.Tags; -public class CpuMeter { +public class CpuMeter implements PeriodMeter { private static final Logger LOGGER = LoggerFactory.getLogger(CpuMeter.class); // read from /proc/stat @@ -38,35 +39,33 @@ public class CpuMeter { // read from /proc/self/stat /proc/uptime private final ProcessCpuUsage processCpuUsage; - public CpuMeter(Id id) { - allCpuUsage = new OsCpuUsage(id.withTag(Tag.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_ALL_CPU))); - processCpuUsage = new ProcessCpuUsage(id.withTag(Tag.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_PROCESS_CPU))); + public CpuMeter(MeterRegistry meterRegistry, String name) { + allCpuUsage = new OsCpuUsage(); + processCpuUsage = new ProcessCpuUsage(); - //must refresh all first - update(); - allCpuUsage.setUsage(0); - processCpuUsage.setUsage(0); - } + Gauge.builder(name, allCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_ALL_CPU)) + .register(meterRegistry); - public void calcMeasurements(List<Measurement> measurements, long msNow) { - update(); - measurements.add(new Measurement(() -> allCpuUsage.getUsage(), Statistic.VALUE)); - measurements.add(new Measurement(() -> processCpuUsage.getUsage(), Statistic.VALUE)); + Gauge.builder(name, processCpuUsage::getUsage).tags(Tags.of(OsMeter.OS_TYPE, OsMeter.OS_TYPE_PROCESS_CPU)) + .register(meterRegistry); } - public void update() { + @Override + public void poll(long msNow, long secondInterval) { try { allCpuUsage.update(); processCpuUsage.update(); - } catch (Throwable e) { - LOGGER.error("Failed to update usage", e); + } catch (IOException e) { + LOGGER.error("Failed to update cpu usage", e); } } + @VisibleForTesting public OsCpuUsage getAllCpuUsage() { return allCpuUsage; } + @VisibleForTesting public ProcessCpuUsage getProcessCpuUsage() { return processCpuUsage; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java index d7893095b..28427801b 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/NetMeter.java @@ -19,24 +19,22 @@ package org.apache.servicecomb.metrics.core.meter.os; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.apache.commons.io.FileUtils; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; import org.apache.servicecomb.metrics.core.meter.os.net.InterfaceUsage; -import org.apache.servicecomb.metrics.core.meter.os.net.NetStat; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import io.micrometer.core.instrument.Measurement; -import io.micrometer.core.instrument.Meter.Id; +import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Tags; -public class NetMeter { +public class NetMeter implements PeriodMeter { private static final Logger LOGGER = LoggerFactory.getLogger(NetMeter.class); public static final String STATISTIC = "statistic"; @@ -51,23 +49,24 @@ public class NetMeter { public static final Tag TAG_PACKETS_SEND = Tag.of(STATISTIC, "sendPackets"); - private final Id id; - private final Map<String, InterfaceUsage> interfaceUsageMap = new ConcurrentHashMap<>(); - public NetMeter(Id id) { - this.id = id; - // init lastRxBytes, lastRxPackets, lastTxBytes, lastTxPackets - refreshNet(1); - interfaceUsageMap.values().forEach(interfaceUsage -> interfaceUsage.getNetStats().forEach(NetStat::clearRate)); - } + protected final MeterRegistry meterRegistry; - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - refreshNet(secondInterval); + protected final String name; - interfaceUsageMap.values().forEach(interfaceUsage -> interfaceUsage.calcMeasurements(measurements, msNow)); + protected final Tags tags; + + public NetMeter(MeterRegistry meterRegistry, String name, Tags tags) { + this.meterRegistry = meterRegistry; + this.name = name; + this.tags = tags; } + @Override + public void poll(long msNow, long secondInterval) { + refreshNet(secondInterval); + } /* * Inter-| Receive | Transmit @@ -79,7 +78,6 @@ public class NetMeter { try { File file = new File("/proc/net/dev"); List<String> netInfo = FileUtils.readLines(file, StandardCharsets.UTF_8); - Set<String> nameSet = new HashSet<>(); //the first two lines is useless for (int i = 2; i < netInfo.size(); i++) { @@ -90,19 +88,12 @@ public class NetMeter { continue; } - String name = strings[0].trim(); - nameSet.add(name); + String interfaceName = strings[0].trim(); - InterfaceUsage interfaceUsage = interfaceUsageMap.computeIfAbsent(name, key -> new InterfaceUsage(id, key)); + InterfaceUsage interfaceUsage = interfaceUsageMap.computeIfAbsent(interfaceName, + key -> new InterfaceUsage(meterRegistry, name, tags, key)); interfaceUsage.update(strings[1], secondInterval); } - - // clear deleted interfaces - for (String interfaceName : interfaceUsageMap.keySet()) { - if (!nameSet.contains(interfaceName)) { - this.interfaceUsageMap.remove(interfaceName); - } - } } catch (IOException e) { LOGGER.error("Failed to read net info/", e); } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java index 7425e28fc..832773012 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/OsMeter.java @@ -16,16 +16,12 @@ */ package org.apache.servicecomb.metrics.core.meter.os; -import java.util.ArrayList; -import java.util.List; - -import org.apache.servicecomb.foundation.metrics.meter.AbstractPeriodMeter; +import org.apache.servicecomb.foundation.metrics.meter.PeriodMeter; import com.google.common.annotations.VisibleForTesting; -import io.micrometer.core.instrument.Measurement; import io.micrometer.core.instrument.MeterRegistry; -import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Tags; /** * name=os type=cpu value = 0 @@ -35,7 +31,7 @@ import io.micrometer.core.instrument.Tag; * name=os type=net interface=eth0 statistic=sendPackets value=100 * name=os type=net interface=eth0 statistic=receivePackets value=100 */ -public class OsMeter extends AbstractPeriodMeter { +public class OsMeter implements PeriodMeter { public static final String OS_NAME = "os"; public static final String OS_TYPE = "type"; @@ -51,22 +47,14 @@ public class OsMeter extends AbstractPeriodMeter { private final NetMeter netMeter; public OsMeter(MeterRegistry meterRegistry) { - this.id = Id. - cpuMeter = new CpuMeter(id); - netMeter = new NetMeter(id.withTag(Tag.of(OS_TYPE, OS_TYPE_NET))); - } - - @Override - public void calcMeasurements(long msNow, long secondInterval) { - List<Measurement> measurements = new ArrayList<>(); - calcMeasurements(measurements, msNow, secondInterval); - allMeasurements = measurements; + cpuMeter = new CpuMeter(meterRegistry, OS_NAME); + netMeter = new NetMeter(meterRegistry, OS_NAME, Tags.of(OS_TYPE, OS_TYPE_NET)); } @Override - public void calcMeasurements(List<Measurement> measurements, long msNow, long secondInterval) { - cpuMeter.calcMeasurements(measurements, msNow); - netMeter.calcMeasurements(measurements, msNow, secondInterval); + public void poll(long msNow, long secondInterval) { + cpuMeter.poll(msNow, secondInterval); + netMeter.poll(msNow, secondInterval); } @VisibleForTesting diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java index 8605edeb5..fb2eaa45b 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/AbstractCpuUsage.java @@ -17,12 +17,7 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu; -import io.micrometer.core.instrument.Meter.Id; - public abstract class AbstractCpuUsage { - - protected Id id; - protected double usage; protected int cpuCount = Runtime.getRuntime().availableProcessors(); @@ -38,14 +33,6 @@ public abstract class AbstractCpuUsage { } } - public AbstractCpuUsage(Id id) { - this.id = id; - } - - public Id getId() { - return id; - } - public double getUsage() { return usage; } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java index 8b40f212c..09ac5bc7b 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/OsCpuUsage.java @@ -18,8 +18,6 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu; import java.io.IOException; -import io.micrometer.core.instrument.Meter.Id; - /* * unit : 1 jiffies * more details : @@ -37,8 +35,7 @@ public class OsCpuUsage extends AbstractCpuUsage { private final Period idle = new Period(); - public OsCpuUsage(Id id) { - super(id); + public OsCpuUsage() { } public void update() throws IOException { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java index 6ab7ad828..1e0f55e68 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/cpu/ProcessCpuUsage.java @@ -18,8 +18,6 @@ package org.apache.servicecomb.metrics.core.meter.os.cpu; import java.io.IOException; -import io.micrometer.core.instrument.Meter.Id; - /* * unit : 1 jiffies * more details : @@ -41,8 +39,7 @@ public class ProcessCpuUsage extends AbstractCpuUsage { private final int userHZ = CpuUtils.calcHertz(); - public ProcessCpuUsage(Id id) { - super(id); + public ProcessCpuUsage() { } public void update() throws IOException { diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java index a72217894..432975bfa 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/InterfaceUsage.java @@ -22,51 +22,49 @@ import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_PACKETS_ import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_RECEIVE; import static org.apache.servicecomb.metrics.core.meter.os.NetMeter.TAG_SEND; -import java.util.ArrayList; -import java.util.List; - -import io.micrometer.core.instrument.Measurement; -import io.micrometer.core.instrument.Meter.Id; -import io.micrometer.core.instrument.Statistic; +import io.micrometer.core.instrument.Gauge; +import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.Tag; +import io.micrometer.core.instrument.Tags; public class InterfaceUsage { - private final String name; + private final String interfaceName; - private final List<NetStat> netStats = new ArrayList<>(); + private final NetStat receive; - public InterfaceUsage(Id id, String name) { - this.name = name; - id = id.withTag(Tag.of(INTERFACE, name)); - init(id); - } + private final NetStat send; + + private final NetStat packetsReceive; + + private final NetStat packetsSend; + + public InterfaceUsage(MeterRegistry meterRegistry, String name, Tags tags, String interfaceName) { + this.interfaceName = interfaceName; + tags.and(Tag.of(INTERFACE, name)); - private void init(Id id) { // recv/Bps - netStats.add(new NetStat(id.withTag(TAG_RECEIVE), 0)); + receive = new NetStat(0); + Gauge.builder(name, receive::getRate).tags(tags.and(TAG_RECEIVE, null)).register(meterRegistry); // send/Bps - netStats.add(new NetStat(id.withTag(TAG_SEND), 8)); - + send = new NetStat(8); + Gauge.builder(name, send::getRate).tags(tags.and(TAG_SEND, null)).register(meterRegistry); // recv/pps - netStats.add(new NetStat(id.withTag(TAG_PACKETS_RECEIVE), 1)); + packetsReceive = new NetStat(1); + Gauge.builder(name, packetsReceive::getRate).tags(tags.and(TAG_PACKETS_RECEIVE, null)).register(meterRegistry); // send/pps - netStats.add(new NetStat(id.withTag(TAG_PACKETS_SEND), 9)); - } - - public void calcMeasurements(List<Measurement> measurements, long msNow) { - netStats.forEach(netStat -> measurements.add(new Measurement(() -> netStat.getRate(), Statistic.VALUE))); + packetsSend = new NetStat(9); + Gauge.builder(name, packetsSend::getRate).tags(tags.and(TAG_PACKETS_SEND, null)).register(meterRegistry); } public void update(String interfaceData, long secondInterval) { String[] netInfo = interfaceData.trim().split("\\s+"); - netStats.forEach(netStat -> netStat.update(netInfo, secondInterval)); + receive.update(netInfo, secondInterval); + send.update(netInfo, secondInterval); + packetsReceive.update(netInfo, secondInterval); + packetsSend.update(netInfo, secondInterval); } public String getName() { - return name; - } - - public List<NetStat> getNetStats() { - return netStats; + return interfaceName; } } diff --git a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java index 48b3d9d7d..fac707dce 100644 --- a/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java +++ b/metrics/metrics-core/src/main/java/org/apache/servicecomb/metrics/core/meter/os/net/NetStat.java @@ -17,21 +17,16 @@ package org.apache.servicecomb.metrics.core.meter.os.net; -import io.micrometer.core.instrument.Meter.Id; - public class NetStat { private final int index; - private final Id id; - // send/recv bytes/packets private long lastValue; // Bps/pps private double rate; - public NetStat(Id id, int index) { - this.id = id; + public NetStat(int index) { this.index = index; } @@ -56,8 +51,4 @@ public class NetStat { public int getIndex() { return index; } - - public Id getId() { - return id; - } }
