Add planetiler-specific metadata (#428)

pull/431/head
Michael Barry 2023-01-02 11:26:00 -05:00 zatwierdzone przez GitHub
rodzic 89de82244e
commit dad2073f61
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
5 zmienionych plików z 106 dodań i 25 usunięć

Wyświetl plik

@ -15,6 +15,7 @@ import com.onthegomap.planetiler.reader.osm.OsmReader;
import com.onthegomap.planetiler.stats.ProcessInfo; import com.onthegomap.planetiler.stats.ProcessInfo;
import com.onthegomap.planetiler.stats.Stats; import com.onthegomap.planetiler.stats.Stats;
import com.onthegomap.planetiler.stats.Timers; import com.onthegomap.planetiler.stats.Timers;
import com.onthegomap.planetiler.util.BuildInfo;
import com.onthegomap.planetiler.util.ByteBufferUtil; import com.onthegomap.planetiler.util.ByteBufferUtil;
import com.onthegomap.planetiler.util.Downloader; import com.onthegomap.planetiler.util.Downloader;
import com.onthegomap.planetiler.util.FileUtils; import com.onthegomap.planetiler.util.FileUtils;
@ -25,14 +26,11 @@ import com.onthegomap.planetiler.util.ResourceUsage;
import com.onthegomap.planetiler.util.Translations; import com.onthegomap.planetiler.util.Translations;
import com.onthegomap.planetiler.util.Wikidata; import com.onthegomap.planetiler.util.Wikidata;
import com.onthegomap.planetiler.worker.RunnableThatThrows; import com.onthegomap.planetiler.worker.RunnableThatThrows;
import java.io.IOException;
import java.nio.file.FileSystem; import java.nio.file.FileSystem;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.function.Function; import java.util.function.Function;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -95,6 +93,7 @@ public class Planetiler {
private boolean useWikidata = false; private boolean useWikidata = false;
private boolean onlyFetchWikidata = false; private boolean onlyFetchWikidata = false;
private boolean fetchWikidata = false; private boolean fetchWikidata = false;
private MbtilesMetadata mbtilesMetadata;
private Planetiler(Arguments arguments) { private Planetiler(Arguments arguments) {
this.arguments = arguments; this.arguments = arguments;
@ -175,6 +174,10 @@ public class Planetiler {
name + "_pass2: Process OpenStreetMap nodes, ways, then relations" name + "_pass2: Process OpenStreetMap nodes, ways, then relations"
), ),
ifSourceUsed(name, () -> { ifSourceUsed(name, () -> {
var header = osmInputFile.getHeader();
mbtilesMetadata.set("planetiler:" + name + ":osmosisreplicationtime", header.instant());
mbtilesMetadata.set("planetiler:" + name + ":osmosisreplicationseq", header.osmosisReplicationSequenceNumber());
mbtilesMetadata.set("planetiler:" + name + ":osmosisreplicationurl", header.osmosisReplicationBaseUrl());
try ( try (
var nodeLocations = var nodeLocations =
LongLongMap.from(config.nodeMapType(), config.nodeMapStorage(), nodeDbPath, config.nodeMapMadvise()); LongLongMap.from(config.nodeMapType(), config.nodeMapStorage(), nodeDbPath, config.nodeMapMadvise());
@ -499,7 +502,12 @@ public class Planetiler {
*/ */
public void run() throws Exception { public void run() throws Exception {
var showVersion = arguments.getBoolean("version", "show version then exit", false); var showVersion = arguments.getBoolean("version", "show version then exit", false);
printVersionInfoFromManifest(); var buildInfo = BuildInfo.get();
if (buildInfo != null && LOGGER.isInfoEnabled()) {
LOGGER.info("Planetiler build git hash: {}", buildInfo.githash());
LOGGER.info("Planetiler build version: {}", buildInfo.version());
LOGGER.info("Planetiler build timestamp: {}", buildInfo.buildTimeString());
}
if (showVersion) { if (showVersion) {
System.exit(0); System.exit(0);
} }
@ -516,7 +524,7 @@ public class Planetiler {
throw new IllegalArgumentException("Can only run once"); throw new IllegalArgumentException("Can only run once");
} }
ran = true; ran = true;
MbtilesMetadata mbtilesMetadata = new MbtilesMetadata(profile, config.arguments()); mbtilesMetadata = new MbtilesMetadata(profile, config.arguments());
if (arguments.getBoolean("help", "show arguments then exit", false)) { if (arguments.getBoolean("help", "show arguments then exit", false)) {
System.exit(0); System.exit(0);
@ -607,22 +615,6 @@ public class Planetiler {
stats.close(); stats.close();
} }
public static void printVersionInfoFromManifest() {
try (var properties = Planetiler.class.getResourceAsStream("/buildinfo.properties")) {
var parsed = new Properties();
parsed.load(properties);
LOGGER.info("Planetiler build git hash: {}", parsed.getProperty("githash"));
LOGGER.info("Planetiler build version: {}", parsed.getProperty("version"));
var epochMs = parsed.getProperty("timestamp");
if (epochMs != null && !epochMs.isBlank() && epochMs.matches("^\\d+$")) {
var time = Instant.ofEpochMilli(Long.parseLong(epochMs));
LOGGER.info("Planetiler build timestamp: {}", time);
}
} catch (IOException e) {
LOGGER.error("Error getting build properties");
}
}
private void checkDiskSpace() { private void checkDiskSpace() {
ResourceUsage readPhase = new ResourceUsage("read phase disk"); ResourceUsage readPhase = new ResourceUsage("read phase disk");
ResourceUsage writePhase = new ResourceUsage("write phase disk"); ResourceUsage writePhase = new ResourceUsage("write phase disk");

Wyświetl plik

@ -2,6 +2,9 @@ package com.onthegomap.planetiler.config;
import com.onthegomap.planetiler.Profile; import com.onthegomap.planetiler.Profile;
import com.onthegomap.planetiler.mbtiles.MbtilesWriter; import com.onthegomap.planetiler.mbtiles.MbtilesWriter;
import com.onthegomap.planetiler.util.BuildInfo;
import java.util.LinkedHashMap;
import java.util.Map;
/** Controls information that {@link MbtilesWriter} will write to the mbtiles metadata table. */ /** Controls information that {@link MbtilesWriter} will write to the mbtiles metadata table. */
public record MbtilesMetadata( public record MbtilesMetadata(
@ -9,7 +12,8 @@ public record MbtilesMetadata(
String description, String description,
String attribution, String attribution,
String version, String version,
String type String type,
Map<String, String> planetilerSpecific
) { ) {
public MbtilesMetadata(Profile profile) { public MbtilesMetadata(Profile profile) {
@ -18,7 +22,8 @@ public record MbtilesMetadata(
profile.description(), profile.description(),
profile.attribution(), profile.attribution(),
profile.version(), profile.version(),
profile.isOverlay() ? "overlay" : "baselayer" profile.isOverlay() ? "overlay" : "baselayer",
mapWithBuildInfo()
); );
} }
@ -29,7 +34,32 @@ public record MbtilesMetadata(
args.getString("mbtiles_attribution", "'attribution' attribute for mbtiles metadata", profile.attribution()), args.getString("mbtiles_attribution", "'attribution' attribute for mbtiles metadata", profile.attribution()),
args.getString("mbtiles_version", "'version' attribute for mbtiles metadata", profile.version()), args.getString("mbtiles_version", "'version' attribute for mbtiles metadata", profile.version()),
args.getString("mbtiles_type", "'type' attribute for mbtiles metadata", args.getString("mbtiles_type", "'type' attribute for mbtiles metadata",
profile.isOverlay() ? "overlay" : "baselayer") profile.isOverlay() ? "overlay" : "baselayer"),
mapWithBuildInfo()
); );
} }
private static Map<String, String> mapWithBuildInfo() {
Map<String, String> result = new LinkedHashMap<>();
var buildInfo = BuildInfo.get();
if (buildInfo != null) {
if (buildInfo.version() != null) {
result.put("planetiler:version", buildInfo.version());
}
if (buildInfo.githash() != null) {
result.put("planetiler:githash", buildInfo.githash());
}
if (buildInfo.buildTimeString() != null) {
result.put("planetiler:buildtime", buildInfo.buildTimeString());
}
}
return result;
}
public MbtilesMetadata set(String key, Object value) {
if (key != null && value != null) {
planetilerSpecific.put(key, value.toString());
}
return this;
}
} }

Wyświetl plik

@ -326,7 +326,7 @@ public class MbtilesWriter {
db.createTablesWithIndexes(); db.createTablesWithIndexes();
} }
db.metadata() var metadata = db.metadata()
.setName(mbtilesMetadata.name()) .setName(mbtilesMetadata.name())
.setFormat("pbf") .setFormat("pbf")
.setDescription(mbtilesMetadata.description()) .setDescription(mbtilesMetadata.description())
@ -338,6 +338,10 @@ public class MbtilesWriter {
.setMaxzoom(config.maxzoom()) .setMaxzoom(config.maxzoom())
.setJson(layerStats.getTileStats()); .setJson(layerStats.getTileStats());
for (var entry : mbtilesMetadata.planetilerSpecific().entrySet()) {
metadata.setMetadata(entry.getKey(), entry.getValue());
}
TileCoord lastTile = null; TileCoord lastTile = null;
Timer time = null; Timer time = null;
int currentZ = Integer.MIN_VALUE; int currentZ = Integer.MIN_VALUE;

Wyświetl plik

@ -0,0 +1,45 @@
package com.onthegomap.planetiler.util;
import com.onthegomap.planetiler.Planetiler;
import java.io.IOException;
import java.time.Instant;
import java.util.Properties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** Accessor for the build info inserted by maven into the {@code buildinfo.properties} file. */
public record BuildInfo(String githash, String version, Long buildTime) {
private static final Logger LOGGER = LoggerFactory.getLogger(BuildInfo.class);
private static final BuildInfo instance;
static {
BuildInfo result = null;
try (var properties = Planetiler.class.getResourceAsStream("/buildinfo.properties")) {
var parsed = new Properties();
parsed.load(properties);
String githash = parsed.getProperty("githash");
String version = parsed.getProperty("version");
String epochMs = parsed.getProperty("timestamp");
Long buildTime = null;
if (epochMs != null && !epochMs.isBlank() && epochMs.matches("^\\d+$")) {
buildTime = Long.parseLong(epochMs);
}
result = new BuildInfo(githash, version, buildTime);
} catch (IOException e) {
LOGGER.error("Error getting build properties");
}
instance = result;
}
public String buildTimeString() {
return buildTime == null ? null : Instant.ofEpochMilli(buildTime).toString();
}
/** Returns info inserted by maven at build-time into the {@code buildinfo.properties} file. */
public static BuildInfo get() {
return instance;
}
}

Wyświetl plik

@ -23,6 +23,7 @@ import com.onthegomap.planetiler.reader.osm.OsmElement;
import com.onthegomap.planetiler.reader.osm.OsmReader; import com.onthegomap.planetiler.reader.osm.OsmReader;
import com.onthegomap.planetiler.reader.osm.OsmRelationInfo; import com.onthegomap.planetiler.reader.osm.OsmRelationInfo;
import com.onthegomap.planetiler.stats.Stats; import com.onthegomap.planetiler.stats.Stats;
import com.onthegomap.planetiler.util.BuildInfo;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -248,6 +249,9 @@ class PlanetilerTests {
"center", "0,0,0", "center", "0,0,0",
"bounds", "-180,-85.05113,180,85.05113" "bounds", "-180,-85.05113,180,85.05113"
), results.metadata); ), results.metadata);
assertSubmap(Map.of(
"planetiler:version", BuildInfo.get().version()
), results.metadata);
assertSameJson( assertSameJson(
""" """
{ {
@ -1683,6 +1687,12 @@ class PlanetilerTests {
assertEquals(11, tileMap.size(), "num tiles"); assertEquals(11, tileMap.size(), "num tiles");
assertEquals(2146, features, "num buildings"); assertEquals(2146, features, "num buildings");
assertSubmap(Map.of(
"planetiler:version", BuildInfo.get().version(),
"planetiler:osm:osmosisreplicationtime", "2021-04-21T20:21:46Z",
"planetiler:osm:osmosisreplicationseq", "2947",
"planetiler:osm:osmosisreplicationurl", "http://download.geofabrik.de/europe/monaco-updates"
), db.metadata().getAll());
} }
} }